我一直在使用CMake开发一个研究代码,以便在Ubuntu机器上为c ++代码生成Makefile。我链接了几个共享库,这些共享库涉及在机器上进行设置和构建(特别是一个具有十几个版本特定的依赖项,这些依赖项本身并不容易构建)。有些也是库的自定义构建(错误修复)。
我对使用CLR的Windows环境更熟悉,但是,我希望实现的是构建二进制文件并包含所有共享库。希望其他环境(redhat EL6)上的链接器能够在运行时使用这些共享对象。
由于链接器没有查看应用程序路径,因此我假设我还需要将共享库放入用户特定的库路径中以供查找。
使用Cmake(可能是Cpack)是否有一种很好的方法来构建二进制文件并将“包”所有共享对象用于另一台机器?然后我可以(即使手动)只为我的用户安装共享库,并在那里运行二进制文件。
我希望答案不是使用静态库,因为过去这些依赖项给我带来了很多麻烦。
我是一个Linux菜鸟,所以如果我的问题是缺乏理解,那么我会听到更好的方法:)
答案 0 :(得分:2)
一种方法是设置二进制文件的“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