代码改变世界

在linux下qt中使用pjsip编译成功

2015-10-30 10:06  fengguowuhen201314  阅读(2355)  评论(0编辑  收藏  举报

由于最近这个项目需要用到pisip,还需要用到qt编写界面,开发环境还是在linux下的,所以编译pjsip就成为一个很蛋疼的事情。

正常来说,在qt中需要引用其他的库只要在.pro文件中LIBS变量加入库的具体路径就可以了。但是由于pjsip库存在很多外界依赖以及pjsip自身的库于库之间也存在着很多依赖,所以导致在编译的时候产生了很多问题,现在就把问题归结如下,以便下次忘记了。

1、首先是pjsip库于库之间的依赖关系,因为pjsip的层次结构比较明显,因此库的依赖也就多了,在此给出pjsip库之间的正确的依赖关系,在LIBS变量中加入库的时候应该按照如下方式添加:

-lpjsua \
-lpjsip-ua \
-lpjsip-simple \
-lpjsip \
-lpjmedia-codec \
-lpjmedia-videodev \
-lpjmedia \
-lpjmedia-audiodev \
-lpjnath \
-lpjlib-util \
-lresample\
-lsrtp\
-lgsmcodec\
-lspeex\
-lilbccodec\
-lg7221codec\
-lportaudio\
-lpj\

这是pjsip自身库的依赖关系。但是单单这样是不够的,因为pjsip的强大,它还引用了别的关系库,若是这样编译的话还会出现其他错误,比如出现一系列未定义的引用,这些引用都出现在pa_linux_alsa.c中,如snd_pcm_status,snd_pcm_status_get_state等等,这是因为在linux下pjsip还调用alsa(高级linux音频框架),所以我们还应该在.pro文件的LIBS变量中加入-lasound

此外,还有一个重要的问题,我们在编译pjsip源码的时候需要在project/pjlib/include/pj目录下添加config_site.h文件,如果在这个文件中没有加入#define  PJMEDIA_HAS_VIDEO 1的话,编译出来的库文件使用的时候会出现encoder_interface_init()、encoder_interface_exit()、encoder_interface_encode()、encoder_interface_decode()等函数未定义,此时要在LIBS中加入-lopencore-amrnb问题解决(但是这仅局限与代码中没有音视频编码解码的时候,大多数情况下都不可能),因此我们需要在编译的时候加入上述那句话。但是编译的时候会产生很多ffmpeg中的借口未定义,此时就要加入ffmpeg的库的路径了,但是需要注意的是,LIBS变量全部加完之后,qt开始检查库,而且在LIBS变量中加入的库,是左边的库依赖于右边的库,换句话说,如果LIBS += -laa -lbb,如果bb库某个函数依赖与aa库中的某个函数,则会编译失败,就算要写成两行,如LIBS += -laa    LIBS += -lbb,也要按照依赖顺序写,否则会出错,这个地方强调的就是,我在这个地方添加ffmpeg的库的时候,把ffmpeg库的添加放到pjsip库的添加前面了,所以导致编译错误,放到后面编译通过了。到此已经全部编译通过了。顺利完成了。虽然花了一个礼拜,查了很多资料才搞懂了这个pjsip的编译,但是在这过程中也学习到了很多东西,特在此记录一下,以免以后忘记