【发布时间】:2021-02-10 16:17:35
【问题描述】:
我正在尝试收集一些 .so 文件所需的所有依赖项。我使用Recursive ldd 脚本,但这并不重要。
我想把所有的 .so 文件放在一个目录中,说是在
/home/user/project/lib
我有一个奇怪的经历:假设有一个文件 libmat.so 我想收集它的所有依赖项。于是我跑了
/home/user/project/lib$ ldd libmat.so
...
libmwboost_system.so.1.65.1 => /home/user/project/lib/libmwboost_system.so.1.65.1
libmwboost_filesystem.so.1.65.1 => /home/user/project/lib/libmwboost_filesystem.so.1.65.1
...
所以我们看到ldd 识别了当前目录中的libmwboost_system.so.1.65.1 文件。
原来libmwboost_filesystem.so.1.65.1.so 也依赖于libmwboost_system.so.1.65.1,
但是当我运行时:
/home/user/project/lib$ ldd libmwboost_filesystem.so.1.65.1
...
libmwboost_system.so.1.65.1 => not found
...
为什么ldd 在libmat.so 上运行时可以找到它,而在libmwboost_filesystem.so.1.65.1 上运行时却找不到?
如果有人可以在链接过程的上下文中提供解释,我会很高兴。据我所知,当您将文件链接到库时,您使用以下标志:
~$ gcc my_program.c -Lpath/to/solib/for/static/linker -lnameoflib -wl,-rpath=path/to/solib/for/dynamic/linker
这个-Wl,-rpath 标志在可执行文件中嵌入了动态链接器将在运行时搜索的库的路径。对于依赖于其他库的共享库 - 它的工作方式是否相同?
【问题讨论】: