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

C++ 运行可执行文件时设置库的搜索目录,c++,linux,shared-libraries,C++,Linux,Shared Libraries,我有一个我编译并链接到测试应用程序的库。运行测试应用程序时,它会尝试在相对于项目目录的目录中查找.so,但由于应用程序是从可执行文件所在的文件夹运行的,因此无法找到库。我想让应用程序在它所在的目录中查找库,这样我只需要确保。对于可执行文件,我是否必须在编译时将某种参数传递给gcc以实现这一点?这种方法似乎不太适合Linux-y,库应该在/lib或/usr/lib中的某个位置,这就是加载程序的外观。如果它位于其他目录中,可以在运行程序之前尝试使用export LD\u LIBRARY\u PATH

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

这种方法似乎不太适合Linux-y,库应该在/lib或/usr/lib中的某个位置,这就是加载程序的外观。如果它位于其他目录中,可以在运行程序之前尝试使用
export LD\u LIBRARY\u PATH=libpath

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

dlopen(/path/to/library.so, RTLD_LAZY);
您可以在dynamic上找到一个更完整的示例。因此,请在此处加载:

您还可以设置RPATH链接器标志,以便始终在给定目录中搜索特定库:

make LDFLAGS="-Wl,-R -Wl,/home/kris/src"
您可以使用$ORIGIN内置变量引用当前目录:

make CFLAGS="-fPIC" LDFLAGS="-Wl,-rpath '-Wl,\$\$ORIGIN'"
您可以在运行程序时修改“路径”。在编译和链接过程中,编译器只需要第三方库信息。创建可执行文件后,可以将第三方库移动到任何位置

由于您不知道自己使用的是哪个系统,因此可以尝试以下方法:

对于Windows:

set PATH=your library path
对于Linux:

export LD_LIBRARY_PATH=your library path

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

#include<absolute_path_name>
#包括

这会有用的。

谢谢!我最终会这样做,但现在我不断地对它进行更改,不想每次编译时都将它移动到/lib64。他确实这样做了,在某种程度上,这个问题被标记为“linux”:)我没有注意到这一点。谢谢:)我也说过。所以,相对于dll。还说我使用的是GCC(不是MinGW)。如果我不清楚,很抱歉,但感谢您提供了一个windows示例!稍后我会需要它。在编译工作时添加
-Wl,-rpath,'$ORIGIN'
会吗?这会将可执行文件的工作目录(无论在运行时是什么)添加到运行时ld使用的RPATH中。这是一个字面$ORIGIN,而不是一个shell变量,这就是为什么需要引用它的原因。有趣的方法,我将尝试!当然,我应该说“包含目录”而不是“工作目录”。对不起,这是一个糟糕的选择。即使它能工作,也绝对不可移植,即使在同一台计算机上;如果代码被重新定位,则需要对其进行更改。