我正在尝试构建一个与一堆静态和共享库链接的应用程序。这是通过以下命令完成的:
arif@khost:~/sak/pjsip$ gcc -v -o /home/arif/pjsip-samples/sample_apps/playfile.out pjsip-apps/src/samples/playfile.o `pkg-config --libs libpjproject`
pkg-config --libs libpjproject
吐出的地方:
arif@khost:~/sak/pjsip$ pkg-config --libs libpjproject
-pthread -L/opt/pjsip/lib -L/opt/ffmpeg/lib -lpjmedia-videodev-x86_64-unknown-linux-gnu -lpjmedia-audiodev-x86_64-unknown-linux-gnu -lpjmedia-x86_64-unknown-linux-gnu
............(other libraries are omitted)
相关库是[1] pjmedia-audiodev
[2]`pjmedia
此处报告的链接错误:
/opt/pjsip/lib/libpjmedia-x86_64-unknown-linux-gnu.a(endpoint.o): In function `pjmedia_endpt_create':
endpoint.c:(.text+0x14f): undefined reference to `pjmedia_aud_subsys_init'
endpoint.c:(.text+0x1b0): undefined reference to `pjmedia_aud_subsys_shutdown'(etc)
现在不应该是这样,因为:
arif@khost:~/sak/pjsip$ nm /opt/pjsip/lib/libpjmedia-x86_64-unknown-linux-gnu.a | grep pjmedia_aud_subsys
U pjmedia_aud_subsys_init
U pjmedia_aud_subsys_shutdown
U pjmedia_aud_subsys_get_pool_factory
U pjmedia_aud_subsys_init
U pjmedia_aud_subsys_shutdown
`
我知道链接顺序对于共享库非常重要,我认为不应该是这样,因为无论如何我们都在复制目标文件。
我错过了什么吗?
更新 1
我的错,该符号不在 pjmedia 中,而是在 pjmedia-auddev 中:
arif@khost:/opt/pjsip/lib$ nm -C libpjmedia-audiodev-x86_64-unknown-linux-gnu.a | grep pjmedia_aud_subsys_init
0000000000000720 T pjmedia_aud_subsys_init
所以这里显然存在链接顺序问题。因为在命令行中libpjmedia
使用libpjmedia-auddev
但它以错误的顺序给出。
如果我libpjmedia
之前服用,问题就解决了libpjmedia-auddev
。