c++ - CMake 使用依赖的共享库从 Ubuntu 为 RedHat EL6 构建一个独立的二进制文件

标签 c++ linux cmake shared-libraries cross-compiling

我一直在开发一个研究代码,使用 CMake 为 Ubuntu 机器上的 C++ 代码生成 Makefile。我链接了几个共享库,这些库相当涉及在机器上设置和构建(特别是一个有十几个版本特定的依赖项,它们本身并不容易构建)。有些也是库的自定义构建(错误修复)。

我更熟悉带有 CLR 的 Windows 环境,但是,我希望实现的是构建二进制文件并包括所有共享库。希望其他环境 (redhat EL6) 上的链接器能够在运行时使用这些共享对象。

由于链接器不在应用程序路径中查找,我假设我还需要将共享库放入用户特定的库路径中以供它查找。

有没有一种使用 Cmake(也许是 Cpack)的好方法来构建二进制文件并为另一台机器“打包”所有共享对象?然后我可以(即使手动)仅为我的用户安装共享库,并在那里运行二进制文件。

我希望答案不是使用静态库,因为过去这些依赖项给我带来了很多麻烦。

我是一个 linux 菜鸟,所以如果我的问题是缺乏理解更好的方法,我会洗耳恭听 :)

最佳答案

一种方法是设置二进制文件的“rpath”,它硬编码了一些额外的搜索路径。可以将其设置为 $ORIGIN,这意味着将首先使用与二进制文件本身位于同一目录中的库。

IF(UNIX)
  SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_RPATH}:\$ORIGIN/../bin:\$ORIGIN")
ENDIF()

此 CMake 代码在安装时生效 (make install),因此首先您需要设置 CMake 安装程序的 INSTALL 命令。 INSTALL 您的二进制文件和所有额外的共享对象。最后,CPack 在内部运行“安装”,因此一旦 make install 工作,您可以使用 CPack 自动构建 TGZ,如果您愿意花时间进行设置,甚至可以构建 RPM上。

这是我的一个旧答案,它讨论了一个类似但不完全相同的问题,为了完整性而链接: https://stackoverflow.com/a/22209962/1401351

关于c++ - CMake 使用依赖的共享库从 Ubuntu 为 RedHat EL6 构建一个独立的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23396499/

相关文章:

OpenCV编译错误Linking CXX共享库../../lib/libopencv_highgui.so/lib/libbz2.so.1 : could not read symbols: File in wrong format

python - 我可以为我的 Python 扩展模块(用 C++ 编写)使用替代构建系统吗?

头文件中的 C++ 循环依赖

c++ - 使用牛顿法解决数值问题

linux - dma_alloc_coherent() 超过 4mb 的内存分配失败

linux - 我可以在汇编源代码和 ld 脚本中声明自己的部分吗?

c++ - 如何在关键点写坐标?

c++ - 使用 OpenCV 检测两个圆

C++套接字,客户端无法向java服务器发送消息

c++ - 从现有 Makefile 创建 CMakeLists 文件