Gcc 使用-rpath和$ORIGIN链接时查找失败

Gcc 使用-rpath和$ORIGIN链接时查找失败,gcc,linker,shared,rpath,Gcc,Linker,Shared,Rpath,我正在尝试学习如何使用GCC的链接器ld中带有$ORIGIN的-rpath选项 我正在尝试下面我能想到的最简单的例子,我读到的所有链接似乎都表明我做得对 但是,当我运行可执行文件时,它无法找到共享对象,除非我从$ORIGIN中运行它 在可执行文件main.run上使用readelf-d显示: 0x0000000000000001 (NEEDED) Shared library: [lib/foo.so] ... 0x000000000000000f (RPATH) Library rpath:

我正在尝试学习如何使用GCC的链接器ld中带有$ORIGIN的-rpath选项

我正在尝试下面我能想到的最简单的例子,我读到的所有链接似乎都表明我做得对

但是,当我运行可执行文件时,它无法找到共享对象,除非我从$ORIGIN中运行它

在可执行文件main.run上使用readelf-d显示:


0x0000000000000001 (NEEDED) Shared library: [lib/foo.so]
...
0x000000000000000f (RPATH) Library rpath: [$ORIGIN]
...
与文件相关的文件结构为:

/make/test/dll\u test/ main.run 解放党/ 福索 从dll_测试中执行工作正常。 从别处执行/make/test会产生错误:

dll_test/main.run:加载时出错 共享库:lib/foo.so:无法 打开共享对象文件:没有此类文件 或目录

我使用了-l:foo.so而不是-lfoo,但这不会影响我希望的任何事情

源文件 dll_test/src/foo.cpp dll_test/src/main.cpp

要构建,请在其各自的位置创建这些文件,然后只需在dll_test内或项目根所在的任何位置运行sh make.sh。 它应该生成dll_test/main.run

在dll_测试中运行main.run应该可以运行1。 在dll_测试中运行main.run失败。为什么?

另外,foo.so的路径作为[lib/foo.so]存储在main.run中。我可以把它设为[foo.so]吗?这样我就可以使用-Wl,-rpath,“$ORIGIN/lib”?

您需要-Wl,-rpath,“$ORIGIN/lib”而不仅仅是“$ORIGIN”

编辑:你真的在输入-l:foo.so吗?这似乎很奇怪。。。您应该可以使用-Wl,-rpath,'$ORIGIN/lib'-Llib-lfoo.so。如果这不起作用,请将-Wl、-soname、libfoo.so添加到共享库的链接器命令中。我不能肯定这会解决lib/foo.so问题,但值得一试:

您需要-Wl,-rpath,“$ORIGIN/lib”,而不仅仅是“$ORIGIN”


编辑:你真的在输入-l:foo.so吗?这似乎很奇怪。。。您应该可以使用-Wl,-rpath,'$ORIGIN/lib'-Llib-lfoo.so。如果这不起作用,请将-Wl、-soname、libfoo.so添加到共享库的链接器命令中。我不能肯定这会解决lib/foo.so问题,但值得一试:

为之前的编辑道歉。NoScript隐藏了预览,我以为我是在写原始文本。因为这个问题有点让人困惑,我在这里重写了它:为之前的编辑道歉。NoScript隐藏了预览,我假设我写的是原始文本。因为这个问题有点混乱,我在这里重写了它,-l:foo.so是准确的。我试图避免在我的代码中使用lib前缀,因为它是多余的,特定于linux,而且我更难阅读。尝试了$ORIGIN/lib、$ORIGIN、-Llib和no-L的所有组合。没有运气。试过-lfoo.so和-soname,在那里也没有运气,-l:foo.so是准确的。我试图避免在我的代码中使用lib前缀,因为它是多余的,特定于linux,而且我更难阅读。尝试了$ORIGIN/lib、$ORIGIN、-Llib和no-L的所有组合。没有运气。试过-lfoo.so和-soname,也没有运气。

int foo()
    { return 1; }

int foo();

#include <iostream>


int main()
  {
    std::cout << foo() << std::endl;
  }

mkdir -p -v obj
mkdir -p -v lib

g++ -c -o obj/foo.o src/foo.cpp -fPIC
g++ -shared -o lib/foo.so obj/foo.o

g++ -c -o obj/main.o src/main.cpp
g++ -o main.run obj/main.o -Wl,-rpath,'$ORIGIN' -Llib -l:foo.so