Link 库到 linux C++ 二进制文件
Link libraries to linux biinary file in c++
我正在使用 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(带有所有textures), src和所有要编译的cpp文件,其他文件是项目文件和.o文件
我正在使用 Ubuntu 20.04-2 LTS,其他用户的 PC 也是如此
在此先感谢您的帮助!
这是因为加载运行时依赖项的动态链接器会在某些指定位置查找它们,这些位置“默认”是您的系统库目录(这些库由 apt
安装)。
理想情况下,其他用户也应该安装这些库(如果您构建具有适当依赖项的 .deb 包,则可以“自动”完成)
否则,您将不得不通过添加 -Wl,-rpath='$ORIGIN'
来更改程序的运行路径,这会使动态链接器在二进制文件所在的位置查找依赖项。
$ORIGIN
这里是一个特殊的变量,意思是“这个可执行文件”,这就是你想要实现的。
找到解决方法了!
我使用程序 patchelf 将 rpath 添加到我的目录(链接到二进制文件)现在一切正常
- 使用
ldd ./bin/debug/main
查库
- export LD_LIBRARY_PATH =$LD_LIBRARY_PATH:"你的库路径"
- 运行 程序,如果这个不行。使用 patchelf 将 rpath 更改为您的 r library
我正在使用 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(带有所有textures), src和所有要编译的cpp文件,其他文件是项目文件和.o文件
我正在使用 Ubuntu 20.04-2 LTS,其他用户的 PC 也是如此
在此先感谢您的帮助!
这是因为加载运行时依赖项的动态链接器会在某些指定位置查找它们,这些位置“默认”是您的系统库目录(这些库由 apt
安装)。
理想情况下,其他用户也应该安装这些库(如果您构建具有适当依赖项的 .deb 包,则可以“自动”完成)
否则,您将不得不通过添加 -Wl,-rpath='$ORIGIN'
来更改程序的运行路径,这会使动态链接器在二进制文件所在的位置查找依赖项。
$ORIGIN
这里是一个特殊的变量,意思是“这个可执行文件”,这就是你想要实现的。
找到解决方法了!
我使用程序 patchelf 将 rpath 添加到我的目录(链接到二进制文件)现在一切正常
- 使用
ldd ./bin/debug/main
查库 - export LD_LIBRARY_PATH =$LD_LIBRARY_PATH:"你的库路径"
- 运行 程序,如果这个不行。使用 patchelf 将 rpath 更改为您的 r library