从库中生成可执行文件时 -Wl,-rpath 的用途是什么
What is the use of -Wl,-rpath in while making the executable from the library
我们知道制作可执行文件的命令是:
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
有两种解决方法:
1)
LD_LIBRARY_PATH=/home/username/foo
2)
gcc -L/home/username/foo -Wl,-rpath=/home/username/foo -Wall -o test main.c -lfoo
我的问题是为什么需要为加载器提供库路径?在制作可执行文件时我明确提到了链接器可以创建可执行文件的路径,我相信必须有一个位置的引用嵌入在 th execuatble 中的库的数量
这是我的一个概念上的疑问,请清除它out.Thank你
这只是 link 设计师们做出的选择 -- 但这是一个很好的选择。
它之所以好是因为它可以让你建立一个库,link 反对它,然后安装可执行文件和库而不需要重新link。
代价是你必须使用LD_LIBRARY_PATH
之类的东西来运行构建树中的可执行文件;但通常这没有问题,因为您可以将所需的设置添加到 make check
或者您有什么。
如果默认设置被翻转,那么您将不得不在安装时重新link(这有点不友好,因为它对于 make install
作为 root 来说相当常见);或提供一个标志以在构建时关闭行为(但随后您又回到了上面...)。
-Wl,rptath:
它实际上构建了可执行文件,提供了加载程序将在何处检查要加载的库的信息。
让我举两个案例的例子:
1)
如果我将库和可执行文件转移到另一台机器并将它们放在 2 个不同的位置,那么我需要通过设置 LD_LIBRARY_PATH
来提及库所在的路径。然后加载程序将了解在执行时在哪里寻找加载程序.
2) 如果我使用 -Wl,rpath=
制作可执行文件,那么我需要将可执行文件放在另一台机器中与 -Wl,rpath=
.
的值相同的路径中
所以简单来说,我们可以说我们可以独立地放置库 LD_LIBRARY_PATH
我们知道制作可执行文件的命令是:
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
有两种解决方法: 1)
LD_LIBRARY_PATH=/home/username/foo
2)
gcc -L/home/username/foo -Wl,-rpath=/home/username/foo -Wall -o test main.c -lfoo
我的问题是为什么需要为加载器提供库路径?在制作可执行文件时我明确提到了链接器可以创建可执行文件的路径,我相信必须有一个位置的引用嵌入在 th execuatble 中的库的数量
这是我的一个概念上的疑问,请清除它out.Thank你
这只是 link 设计师们做出的选择 -- 但这是一个很好的选择。
它之所以好是因为它可以让你建立一个库,link 反对它,然后安装可执行文件和库而不需要重新link。
代价是你必须使用LD_LIBRARY_PATH
之类的东西来运行构建树中的可执行文件;但通常这没有问题,因为您可以将所需的设置添加到 make check
或者您有什么。
如果默认设置被翻转,那么您将不得不在安装时重新link(这有点不友好,因为它对于 make install
作为 root 来说相当常见);或提供一个标志以在构建时关闭行为(但随后您又回到了上面...)。
-Wl,rptath:
它实际上构建了可执行文件,提供了加载程序将在何处检查要加载的库的信息。
让我举两个案例的例子:
1)
如果我将库和可执行文件转移到另一台机器并将它们放在 2 个不同的位置,那么我需要通过设置 LD_LIBRARY_PATH
来提及库所在的路径。然后加载程序将了解在执行时在哪里寻找加载程序.
2) 如果我使用 -Wl,rpath=
制作可执行文件,那么我需要将可执行文件放在另一台机器中与 -Wl,rpath=
.
所以简单来说,我们可以说我们可以独立地放置库 LD_LIBRARY_PATH