linux下如何知道链接程序时链接 (使用)的库的绝对路径


我编译的程序需要使用库A/B/C,库A和B也依赖C,使用cmake生成的makefile中的命令是 g++ xxx -lA -lB -lC xxx ,这样链接出的程序有BUG,运行时库C报错.
修改cmake使命令变成 g++ xxx -L/usr/local/lib -lA -lB -lC xxx 后,之前的BUG就没有了.

不知道链接的是动态库还是静态库,所以不知道是链接的哪个库有问题.

所以问题是如何查出链接的库文件的绝对路径.


不好意思,可能没有表达清楚,我再说详细一些.
我的程序依赖gstreamer(一个多媒体框架),使用 pkg-config --libs gstreamer-0.10 的输出结果是

-pthread -L/usr/local/lib -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lxml2 -lglib-2.0

之前使用cmake来编译,在CMakeLists.txt的LINK_DIRECTORIES中没有添加目录/usr/local/lib,这样编译链接出的程序在播放某些媒体文件时报错(不是一运行就提示找不到库),信息如下:

(xxxxx:5262): GLib-CRITICAL **: PCRE library is compiled without UTF8 support

** (xxxxx:5262): WARNING **: Compilation of mdvd regex failed: PCRE library is compiled without UTF8 support

查了一下,上面的错误是因为glib-2.0库中使用的PCRE库不支持utf-8

后来,我在CMakeLists.txt的LINK_DIRECTORIES中添加了目录/usr/local/lib(这样生成的makefile中就有了-L/usr/local/lib),于是之前PCRE不支援utf-8的警告不再出现,那些媒体文件也能正常播放了.


感谢各位的回答,下面贴一下ldd的结果
编译时指定库路径/usr/local/lib:


 libgstreamer-0.10.so.0 => /usr/local/lib/libgstreamer-0.10.so.0 (0xb7669000)
libgio-2.0.so.0 => /usr/local/lib/libgio-2.0.so.0 (0xb74fe000)
libgobject-2.0.so.0 => /usr/local/lib/libgobject-2.0.so.0 (0xb74ae000)
libglib-2.0.so.0 => /usr/local/lib/libglib-2.0.so.0 (0xb7382000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb734f000)
libxml2.so.2 => /usr/lib/i386-linux-gnu/libxml2.so.2 (0xb7202000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb711d000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb70fe000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6f54000)
libgmodule-2.0.so.0 => /usr/local/lib/libgmodule-2.0.so.0 (0xb6f4f000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6f23000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb6f1a000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb6f14000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb6efe000)
libselinux.so.1 => /lib/i386-linux-gnu/libselinux.so.1 (0xb6edf000)
libresolv.so.2 => /lib/i386-linux-gnu/libresolv.so.2 (0xb6ec7000)
libffi.so.6 => /usr/lib/i386-linux-gnu/libffi.so.6 (0xb6ec0000)
/lib/ld-linux.so.2 (0xb7753000)

编译时不指定库路径/usr/local/lib:


 libgstreamer-0.10.so.0 => /usr/lib/i386-linux-gnu/libgstreamer-0.10.so.0 (0xb760d000)
libgio-2.0.so.0 => /usr/lib/i386-linux-gnu/libgio-2.0.so.0 (0xb74b6000)
libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xb7466000)
libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xb736d000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb7352000)
libxml2.so.2 => /usr/lib/i386-linux-gnu/libxml2.so.2 (0xb7205000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb7120000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb7101000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6f57000)
libgmodule-2.0.so.0 => /usr/lib/i386-linux-gnu/libgmodule-2.0.so.0 (0xb6f52000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6f26000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb6f1d000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb6f17000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb6f01000)
libselinux.so.1 => /lib/i386-linux-gnu/libselinux.so.1 (0xb6ee2000)
libresolv.so.2 => /lib/i386-linux-gnu/libresolv.so.2 (0xb6eca000)
libffi.so.6 => /usr/lib/i386-linux-gnu/libffi.so.6 (0xb6ec3000)
libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb6e86000)
/lib/ld-linux.so.2 (0xb770f000)

Linux cmake makefile

DozeHow 11 years, 7 months ago

运行时找不到库,肯定是共享库找不到了。
ldd xxx
可以查看可执行文件的共享库的依赖情况。

补充:
估计链接器的默认搜索路径里面有一个不支持utf-8的库文件。执行时候出错。添加了-L /usr/local/lib之后,链接器到新的搜索路径下面找到了支持utf-8的库文件。执行成功。你用ldd看一下你两次链接出来的可执行文件的共享库情况吧。

那一缕阳光很美 answered 11 years, 7 months ago

Your Answer