c++ - 在 C++ 中将库链接到 linux 二进制文件

标签 c++ ubuntu libraries .so rpath

我正在使用 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(带有 debug 子目录,我们在其中获得最终编译)、include(带有 hpp 文件)、res(带有所有纹理)和 src编译所有cpp文件,其他文件是项目文件和.o文件
我正在使用 Ubuntu 20.04-2 LTS,其他用户的 PC 也是如此
提前感谢您的帮助!

最佳答案

这是因为加载运行时依赖项的动态链接器会在某些指定位置查找它们,这些位置“默认”是您的系统库目录(这些库由 apt 安装的位置)。
理想情况下,其他用户也应该安装这些库 (如果您构建具有适当依赖关系的 .deb 包,则可以“自动”完成)
否则,您将不得不通过添加 -Wl,-rpath='$ORIGIN' 来更改程序的运行路径。 ,这使得动态链接器在二进制文件所在的位置查找依赖项。$ORIGIN这是一个特殊的变量,意思是“这个可执行文件”,这是您想要实现的。
rpath
A description of RPATH $ORIGIN

关于c++ - 在 C++ 中将库链接到 linux 二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67902499/

相关文章:

C++/Qt : QTcpSocket won't write after reading

c++ - Linux 上 gcc 4.9.2 的奇怪行为

Docker 容器在连接到 Internet 时未使用 NordLayer VPN

c - mman.h 确实导入了 mmap 函数但未能导入 mremap

python - 我将如何在 Coding Ground 上安装 numpy 库?

android - 当 gradle 中排除库依赖项时,幕后发生了什么?

c++ - "Error: no matching function or call"到我的 Windows 析构函数

c++ - 可以跨 dll 边界返回 const 引用/指向 std::vectors 的指针吗?

ubuntu - 安装 docker-machine 和/或 docker-compose 的 Curl 命令在 Ubuntu Xenial 中不起作用

git - 如何设置ssh key 以在不同用户下从一台机器访问github