运行可执行文件时设置库的搜索目录

时间:2013-11-09 02:45:53

标签: c++ linux shared-libraries

我有一个我编译并链接到测试应用程序的库。运行测试应用程序时,它会尝试在相对于项目目录的目录中找到.so,但由于应用程序是从可执行文件所在的文件夹中运行的,因此无法找到该库。我希望应用程序查看它所在的目录库,这样我只需要确保.so与可执行文件一起使用,在编译时我是否必须将某种参数传递给gcc以实现此目的?

3 个答案:

答案 0 :(得分:1)

这种方法似乎不是Linux-y,库应该位于/ lib或/ usr / lib中,这是加载器所在的位置。如果您在其他目录中有它,则可以在运行程序之前尝试使用export LD_LIBRARY_PATH=libpath

另一种选择是使用dlopen动态打开库,您可以在其中提供路径。

dlopen(/path/to/library.so, RTLD_LAZY);

您可以在此处找到有关动态.so加载的更完整示例: http://tldp.org/HOWTO/Program-Library-HOWTO/dl-libraries.html

您还可以设置RPATH链接器标志,因此将始终搜索给定目录中的某个库:

make LDFLAGS="-Wl,-R -Wl,/home/kris/src"

您可以使用$ ORIGIN内置变量来引用当前目录:

make CFLAGS="-fPIC" LDFLAGS="-Wl,-rpath '-Wl,\$\$ORIGIN'"

答案 1 :(得分:0)

您可以在运行程序时修改“PATH”。编译器在编译和链接过程中只需要第三部分库信息。创建可执行文件后,您可以在任何位置移动第三方库。

由于您没有告诉您所在的系统,您可以尝试以下方式:

对于Windows:

set PATH=your library path

对于Linux:

export LD_LIBRARY_PATH=your library path

答案 2 :(得分:-1)

您可以使用完整路径名包含该库。

#include<absolute_path_name>

这将有效。