我有一个库,我编译并链接到测试应用程序。运行测试应用程序时,它尝试在相对于项目目录的目录中查找 .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/