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

发布于 2022-08-28 22:56:18 字数 3712 浏览 26 评论 0

我编译的程序需要使用库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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

别再吹冷风 2022-09-04 22:56:18

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

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

无尽的现实 2022-09-04 22:56:18

cat /etc/ld.so.conf.d/*
看下里面的东西够不够?
可以自己定义之后放进去的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文