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

标签 c++ linux shared-libraries

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

最佳答案

这种方法看起来不太符合 Linux 风格,库应该位于/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'"

关于c++ - 设置运行可执行文件时库的搜索目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19871812/

相关文章:

linux - 适用于 Linux 的 F# 编辑器

linux - 如何找出自己执行的后台作业

crash - 相同的代码在共享库中无法(某种程度上)工作,但在程序中直接使用时可以工作

java - war-package 内的依赖关系与共享库内的依赖关系

c++ - 读取复杂文件以对 <string,pair<map<string,string> string>> C++

c++ - 如何让 DOxygen 使用和识别注释掉的参数名称?

c++ - VC++2010 中的编译器错误(2008 年干净!), "ambiguous call to overloaded function"

mysql - 为什么 phpmyadmin 和 mysql docker 容器之间的连接不起作用

cocoa-touch - dyld 错误 : image not found

c++ stringstream到不同类型的变量