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

问题描述:

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

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

有没有一种方法可以在链接器中默认查找共享库的可执行文件的目录(如在Windows上)?

谢谢! 马特

您需要$ ORIGIN在您的RPATH中,通过适当的选项ld或其他达尔文工具。见thisthis

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

更新: 你可以看到链接器实际上把你的可执行文件

readelf -d /path/to/exe | grep RPATH 

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

0x0000000f (RPATH)    Library rpath: [$ORIGIN] 
+4

使用$ ORIGIN时,您需要确保$正确引用,以便链接器实际看到它。从命令行,你想要“-rpath \ $ ORIGIN”,并从你想要的“Makefile”“-rpath \ $$ ORIGIN” – 2009-11-23 20:38:29

+0

我正在使用Eclipse和CDT,并且我将这个选项放在各种链接器标志下。我把'-Wl,-rpath = $$ ORIGIN'并在输出窗口中显示一个$。但它似乎并不奏效。我尝试了几个变化,但没有任何反应。这就像链接器忽略了国旗。我已经试过: -Wl,-rpath = $ ORIGIN 轮候册, - rpath的= $ ORIGIN -Wl,-rpath =/$ ORIGIN -Wl,-rpath = $ ORIGIN/ -Wl,-rpath =/$ ORIGIN/ 等 – CuppM 2009-11-23 21:05:01

+0

使用elfdump或本地等价物查看里面有什么?使用ldd并查看它说了什么? – bmargulies 2009-11-23 21:39:11

在shell脚本包装你的程序:

#!/bin/sh 

PROGRAM_DIRECTORY="`dirname "$0"`" 
export LD_LIBRARY_PATH="$PROGRAM_DIRECTORY" 

"$PROGRAM_DIRECTORY/program_executable" "[email protected]" 

如果您运行此脚本(而不是可执行文件)Y我们的程序链接就好了。

+0

是的,这就是我一直在做的,它的工作原理。该应用程序具有使用OpenMPI的并行版本,并且具有共享LD_LIBRARY_PATH的方式。所以我们现在正在使用这种解决方法,但是我们希望有一种更简单的方式来做事情,因为应用程序(以及MPI运行器)需要多个标志来处理内容 – CuppM 2009-11-23 21:07:32

+0

您可以将脚本中的所有参数传递到程序中' “$ @”'。 – 2009-11-23 23:35:55