共享库路径作为可执行目录

Cup*_*ppM 13 c++ linux linker gcc shared-libraries

我有一个应用程序,它被分解为几个库,用于代码重用.在Windows上,我所要做的就是将.dll文件放在与可执行文件相同的路径中,它会自动找到它们.在Linux上(因为它硬编码事物的路径)我必须指定环境变量LD_LIBRARY_PATH或在可执行文件之前预加载库.

我已经看到了一些关于使用链接器选项嵌入路径的事情,-Wl,-rpath=<PATH>并且我已经尝试使用它.作为路径.但这只是查看当前的工作目录,而不是可执行文件的目录.

有没有办法在链接器中指定默认情况下查找共享库的可执行文件目录(如在Windows上)?

谢谢!马特

bma*_*ies 18

您需要通过适当的ld或其他Darwin工具选项在您的RPATH中使用$ ORIGIN.看到这个这个.

请记住,$必须真正以路径结束,因此您需要在链接命令行中引用或转义它.

更新:您可以看到链接器实际放入可执行文件的内容

readelf -d /path/to/exe | grep RPATH
Run Code Online (Sandbox Code Playgroud)

这是输出应该是什么样子:

 0x0000000f (RPATH)              Library rpath: [$ORIGIN]
Run Code Online (Sandbox Code Playgroud)

  • 使用$ ORIGIN时,您需要确保正确引用$,以便链接器实际看到它.从命令行,您需要"-rpath\$ ORIGIN",并从Makefile中获取"-rpath\$$ ORIGIN" (4认同)
  • 这样做了,我只是没有正确地逃避$字符.能够用readelf检查它有助于确保我有正确的参数字符串.在Eclipse中工作的标志字符串是`-Wl,-rpath =\$$ ORIGIN`. (3认同)
  • 如上所述`-rpath\$$ ORIGIN`怎么样? (2认同)