Gcc 从库中生成可执行文件时,-Wl,-rpath在中有什么用途

Gcc 从库中生成可执行文件时,-Wl,-rpath在中有什么用途,gcc,shared-libraries,Gcc,Shared Libraries,我们知道,生成可执行文件的命令是: 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 有两种解决方案: (一) (二) 我的问题是,为什么需要提供加载程序的库路

我们知道,生成可执行文件的命令是:

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
有两种解决方案: (一)

(二)

我的问题是,为什么需要提供加载程序的库路径?在创建可执行文件时,我已经明确提到了该路径,以便链接器可以创建可执行文件,并且我认为必须有嵌入可执行文件的库位置的参考


这是一个概念上的疑问,请澄清。谢谢你,这只是链接器设计师做出的一个选择,但这是一个很好的选择

它之所以好,是因为它允许您构建一个库,对其进行链接,然后安装可执行文件和库,而无需重新链接

代价是您必须使用
LD_LIBRARY_PATH
或类似的方法来运行构建树中的可执行文件;但通常这没有问题,因为您可以将所需的设置添加到
make check
或您所拥有的内容中


如果默认设置被翻转,那么您必须要么在安装时重新链接(这有点不友好,因为
将install
设置为root用户相当常见);或者提供一个标志来关闭构建时的行为(但现在您又回到上面…。

这只是链接器设计者做出的一个选择,但这是一个很好的选择

它之所以好,是因为它允许您构建一个库,对其进行链接,然后安装可执行文件和库,而无需重新链接

代价是您必须使用
LD_LIBRARY_PATH
或类似的方法来运行构建树中的可执行文件;但通常这没有问题,因为您可以将所需的设置添加到
make check
或您所拥有的内容中


如果默认设置被翻转,那么您必须要么在安装时重新链接(这有点不友好,因为
将install
设置为root用户相当常见);或者提供一个标志来关闭构建时的行为(但现在您又回到上面…。

-Wl,rpath:
它实际构建了可执行文件,提供加载程序将在其中检查库以进行加载的信息。 让我举两个例子:

(一) 如果我将库和可执行文件传输到另一台机器,并将它们放置在两个不同的位置,那么我需要通过设置
LD_library_path
来说明库所在的路径。这样,加载程序在执行时就会明白在哪里查找加载程序

2) 如果我使用
-Wl,rpath=
生成可执行文件,那么我需要将可执行文件放置在另一台机器中与
-Wl,rpath=
的值相同的路径中


因此,简单地说,我们可以说,我们可以独立地将库放置在
LD_library_PATH

-Wl,rpath:
它实际上构建了一个可执行文件,提供加载程序将检查库加载的信息。 让我举两个例子:

(一) 如果我将库和可执行文件传输到另一台机器,并将它们放置在两个不同的位置,那么我需要通过设置
LD_library_path
来说明库所在的路径。这样,加载程序在执行时就会明白在哪里查找加载程序

2) 如果我使用
-Wl,rpath=
生成可执行文件,那么我需要将可执行文件放置在另一台机器中与
-Wl,rpath=
的值相同的路径中

因此,简单地说,我们可以说,我们具有将库与
LD_library\u路径放置的独立性

 LD_LIBRARY_PATH=/home/username/foo
gcc -L/home/username/foo -Wl,-rpath=/home/username/foo -Wall -o test main.c -lfoo