我有一个库,我编译并链接到一个测试应用程序。运行测试应用程序时,它会尝试在相对于项目目录的目录中找到 .so,但由于应用程序是从可执行文件所在的文件夹运行的,因此找不到库。我希望应用程序在它所在的目录中查找库,这样我只需要确保 .so 与可执行文件一起使用,我是否必须在编译时向 gcc 传递某种参数才能实现这一点?
问问题
913 次
3 回答
1
这种方法似乎不太适合 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'"
于 2013-11-09T02:52:34.030 回答
0
您可以在运行程序时修改“PATH”。编译器在编译和链接过程中只需要第三方库信息。创建可执行文件后,您可以将第三方库移动到任何您想要的位置。
由于您没有告诉您在哪个系统上,您可以尝试以下方法:
对于 Windows:
set PATH=your library path
对于 Linux:
export LD_LIBRARY_PATH=your library path
于 2013-11-09T02:55:03.310 回答
-1
您可以使用完整路径名包含该库。
#include<absolute_path_name>
这会奏效。
于 2013-11-09T03:22:15.007 回答