如何解决将库链接到 C++ 中的 linux 二进制文件
我正在使用 g++ 编译一个 c++ 程序,我正在使用两个名为 libsdl2-dev 和 libsdl2-image-dev 的库
我使用命令在我的 ubuntu 机器上安装了这两个库
apt install libsdl2-dev libsdl2-image-dev
并且当我编译程序时一切正常。然后我将这些库从 /usr/lib/x86_64-linux-gnu/
复制到我的工作目录和二进制文件,以便能够将此文件夹提供给其他人。
当尚未安装这些库的用户尝试通过编写 ./main
(二进制文件)来打开我的程序时,问题就出现了。由于他没有安装这些库,他会收到类似“无法打开共享对象:没有这样的文件或目录”的错误消息。
发生这种情况是因为二进制文件在 /usr/lib 等中查找这些库...
我需要什么
我需要我的二进制文件在同一个文件夹中查找这些库,而不是在 /usr/lib/x86 等中,从我读到的内容来看,我必须做一些类似 rpath 的事情
使用的 IDE 是 Sublime Text,用于编译我所有文件的语法是这样的:
g++ -c src/*.cpp -std=c++14 -m64 -g -Wall -I include && g++ *.o -o bin/debug/main -lSDL2main -lSDL2 -lSDL2_image && ./bin/debug/main`
文件夹结构
我得到了项目目录,里面还有 4 个目录,每个目录都称为:bin(带有调试子目录,我们在那里得到最终编译)、include(带有 hpp 文件)、res(带有所有纹理),和 src 包含要编译的所有 cpp 文件,其他文件是项目文件和 .o 文件
我使用的是 Ubuntu 20.04-2 LTS,其他用户的 PC 也是如此
在此先感谢您的帮助!
解决方法
这是因为加载运行时依赖项的动态链接器会在某些指定位置查找它们,这些位置“默认”是您的系统库目录(这些库由 apt
安装的位置)。
理想情况下,其他用户也应该安装这些库(如果您构建具有适当依赖项的 .deb 包,则可以“自动”完成)
否则,您必须通过添加 -Wl,-rpath='$ORIGIN'
来更改程序的运行路径,这会使动态链接器在二进制文件所在的位置查找依赖项。
$ORIGIN
这里是一个特殊的变量,意思是“这个可执行文件”,这是你想要实现的。
见rpath 和A description of RPATH $ORIGIN
,我找到了解决方法!
我使用 patchelf 程序将 rpath 添加到我的目录(链接到二进制文件),现在一切正常
,- 使用
JSON.parse
查看库 - 导出 LD_LIBRARY_PATH =$LD_LIBRARY_PATH:"你的库路径"
- 运行程序,如果这不起作用。使用 patchelf 将 rpath 更改为您的 r 库
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。