链接使用时查找失败

我试图学习如何使用$ORIGIN在GCC的链接器(ld)中使用-rpath选项。

我正在尝试我能想到的最简单的例子(见下文),并且我阅读的所有链接似乎都说我正确地做了。

但是,当我运行可执行文件时,它找不到共享对象,除非我在$ORIGIN运行它。

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


0x0000000000000001 (NEEDED) Shared library: [lib/foo.so]
...
0x000000000000000f (RPATH) Library rpath: [$ORIGIN]
...

文件结构(相关文件)是:

  • /make/test/dll_test/
  • main.run
  • lib/
  • foo.so
  • 从dll_test执行正常工作。 从其他地方执行(/ make / test)会导致错误:

    dll_test / main.run:加载共享库时出错:lib / foo.so:无法打开共享目标文件:没有这样的文件或目录

    我使用-l:foo.so而不是-lfoo ,但这不应该影响任何东西(我希望)。



    源文件

    dll_test/src/foo.cpp

    
    int foo()
        { return 1; }
    

    dll_test/src/main.cpp

    
    int foo();
    
    #include <iostream>
    
    
    int main()
      {
        std::cout << foo() << std::endl;
      }
    


    编写脚本

    dll_test/make.sh

    
    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
    



    要构建,创建这些文件在它们各自的位置,只需在dll_test(或者项目根目录下的任何地方)中运行“sh make.sh”即可。 它应该生成“dll_test / main.run”。

    从dll_test中运行“main.run”应该可以工作(打印1)。
    在dll_test中运行“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”问题,但值得一试:)

    链接地址: http://www.djcxy.com/p/46443.html

    上一篇: Lookup failure when linking using

    下一篇: How to retain text data when orientation changes