我们知道制作可执行文件的命令是:
gcc -L/home/username/foo -Wall -o test main.c -lfoo
但如果运行./test,则会出错:
/test
./test: error while loading shared libraries: libfoo.so: cannot open shared object file: No such file or directory
有2个解决方案: 1)
LD_LIBRARY_PATH=/home/username/foo
2)
gcc -L/home/username/foo -Wl,-rpath=/home/username/foo -Wall -o test main.c -lfoo
我的问题是为什么需要提供加载程序的库路径?虽然使得可执行文件我已经明确提到了路径,以便链接器可以创建可删除的,我相信必须有一个引用的位置嵌入在可执行文件中的库
这是一个概念上的疑问,请清除它。谢谢你
答案 0 :(得分:0)
这只是链接器设计者的一个选择 - 但是很好。
它的好处是它允许你构建一个库,链接它,然后安装可执行文件和库而不需要重新链接。
成本是您必须使用LD_LIBRARY_PATH
等来在构建树中运行可执行文件;但通常这没问题,因为你可以将所需的设置添加到make check
或你有什么。
如果默认值被翻转,那么你必须在安装时重新链接(这有点不友好,因为make install
作为root是相当普遍的);或者提供一个标志来在建立时关闭行为(但是你回到上面......)。
答案 1 :(得分:0)
-Wl,rptath:
它实际上构建了可执行文件,提供了加载器检查库加载的信息。
让我举两个案例:
1)
如果我将库和可执行文件传输到另一台机器并将它们放在两个不同的位置,那么我需要通过设置LD_LIBRARY_PATH
来提及库所在的路径。然后加载器将在执行时了解在哪里查找加载器
2)如果我使用-Wl,rpath=
生成可执行文件,那么我需要将可执行文件放在另一台机器中的同一路径中作为-Wl,rpath=
的值。
因此,简单来说,我们可以说我们具有使用LD_LIBRARY_PATH