【问题标题】:Linux executable can't find shared library in same folderLinux可执行文件在同一文件夹中找不到共享库
【发布时间】:2017-02-20 02:01:34
【问题描述】:

我对 Linux 开发比较陌生,使用 Windows 已经有一段时间了。无论如何,我正在 Windows 和 Linux 上使用 g++ 编译 C++ 游戏(在需要时使用 mingw32),并且正在链接 SDL2 和 SDL2_mixer。在 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

虽然说共享库在同一个文件夹中。我在Stack Overflow上查了几个类似的案例,都涉及到LD_LIBRARY_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 与可执行文件放在同一文件夹中。

提前致谢!

【问题讨论】:

  • pwd 应该是 `pwd`
  • 下一次 - "echo $LD_LIBRARY_PATH" 是你的调试行

标签: c++ linux bash g++ shared-libraries


【解决方案1】:

LD_LIBRARY_PATH 是一种快速的临时 hack,用于指定备用库加载搜索路径。一个更持久和更简洁的解决方案是指定特定的路径集,在这些路径中应该为您的特定二进制文件搜索库特定。这被称为 rpath(关于它的维基百科文章:https://en.wikipedia.org/wiki/Rpath)。可以在二进制 rpath 中指定许多“变量”来替换。在您的情况下,rpath 变量 ${ORIGIN} 对您来说是最有趣的。 ${ORIGIN} 告诉动态链接器在二进制文件所在的同一目录中查找库。

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

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

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

【讨论】:

    猜你喜欢
    • 2012-08-13
    • 2011-12-14
    • 2014-01-14
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 2013-11-11
    • 1970-01-01
    相关资源
    最近更新 更多