CMake从Ubuntu为RedHat EL6构建了一个独立的二进制文件,其中包含依赖的共享库

CMake build a standalone binary for RedHat EL6 from Ubuntu with dependent shared libraries

本文关键字:二进制文件 独立 共享 依赖 包含 一个 RedHat Ubuntu EL6 构建 CMake      更新时间:2023-10-16

我一直在开发一个研究代码,使用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