C++ Linux可执行文件可以';在同一文件夹中找不到共享库

C++ Linux可执行文件可以';在同一文件夹中找不到共享库,c++,linux,bash,g++,shared-libraries,C++,Linux,Bash,G++,Shared Libraries,我对Linux开发比较陌生,已经使用Windows一段时间了。不管怎样,我在Windows和Linux上使用G++编写一个C++游戏(需要时使用明文32),并且AM连接SDL2和SDL2Y混合器。在Windows上,只需将DLL文件与可执行文件放在同一个文件夹中,即可正常运行。然而,在Linux上,尽管代码编译得很好,甚至没有一个警告,但我在运行时得到了以下结果: ./nKaruga: error while loading shared libraries: libSDL2_mixer-2.0

我对Linux开发比较陌生,已经使用Windows一段时间了。不管怎样,我在Windows和Linux上使用G++编写一个C++游戏(需要时使用明文32),并且AM连接SDL2和SDL2Y混合器。在Windows上,只需将DLL文件与可执行文件放在同一个文件夹中,即可正常运行。然而,在Linux上,尽管代码编译得很好,甚至没有一个警告,但我在运行时得到了以下结果:

./nKaruga: error while loading shared libraries: libSDL2_mixer-2.0.so.0: cannot open shared object file: No such file or directory
虽然说共享库在同一个文件夹中。我查找了几个关于堆栈溢出的类似案例,它们都涉及使用
LD\u LIBRARY\u PATH
,并尝试了它,但没有任何效果

% LD_LIBRARY_PATH=pwd
% export LD_LIBRARY_PATH
% ./nKaruga
./nKaruga: error while loading shared libraries: libSDL2_mixer-2.0.so.0: cannot open shared object file: No such file or directory
我想在不一定具有安装依赖项的管理员权限的系统上分发此程序,因此我将SO与可执行文件放在同一文件夹中


提前谢谢

LD_LIBRARY_PATH是一种快速的特殊攻击,用于指定备用库加载搜索路径。一个更持久、更干净的解决方案是指定特定的路径集,在这些路径集中,库将针对特定的二进制文件进行搜索。这被称为rpath(维基百科文章:)。有许多“变量”可以在被替换的二进制rpath中指定。在您的例子中,rpath变量
${ORIGIN}
将是您最感兴趣的
${ORIGIN}
告诉动态链接器在二进制文件所在的目录中查找库

可以在链接时使用
-rpath
链接器选项设置rpath,即通过GCC调用时,该选项将是
-Wl,-rpath='${ORIGIN}'
,即

gcc -o program_binary -Wl,-rpath='${ORIGIN}' -lSDL2_mixer a.o b.o …

对于现有二进制文件,可以使用或工具在事后设置rpath;不过,最好将其设置为正确的链接时间。

pwd
应该是
`pwd`
。下次-“echo$LD\u LIBRARY\u PATH”是您的调试行