将库链接到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等中

使用的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'来更改程序的运行路径,这将使动态链接器仅在二进制文件所在的位置查找依赖项。

CCD_ 6是一个特殊的变量;这个可执行文件";这就是你想要实现的。

参见rpath以及RPATH$ORIGIN 的说明

我找到了解决问题的方法!

我用patchelf程序在我的目录中添加了一个rpath(链接到二进制文件(,现在一切都正常了

  1. 使用ldd ./bin/debug/main检查库
  2. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:";你的图书馆路径">
  3. 如果不起作用,请运行程序。使用patchelf将rpath更改为您的r库

最新更新