我已经写了一个简单的c++程序,使用boost,我想部署在相同架构的机器上,任何linux风格(暂时),可能会或可能不会安装一些boost版本。我是新的部署,但试图阅读文档,并拿出一个CMakeLists.txt,它看起来像:
cmake_minimum_required(VERSION 2.8)
project( myprog )
FIND_PACKAGE( Boost 1.50 COMPONENTS thread system chrono program_options REQUIRED )
INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIR} )
add_executable( myprog myprog.cpp )
target_link_libraries( myprog -lpthread -lboost_system -lboost_chrono -lboost_program_options )
INSTALL( TARGETS myprog DESTINATION . )
SET( CPACK_GENERATOR "TGZ")
INCLUDE( CPack )
一切都编译和运行良好,但打包(make package)只打包可执行文件,而不打包依赖的boost库“.so”
当我跑步时:ldd myprog它告诉我它取决于:网址:linux-vdso.so,libpthread.so,网址:libboost系统,网址:libboost计时,网址:libboost程序选项,网址:libstdc ++.网址:libgcc_s.网址:libc.solibrt.solibm.so
这些是我想要打包的共享库(也许我不需要打包标准库)
如何让cmake获取正确的共享对象库,并将它们放在可执行文件旁边,这样用户只需解压缩文件夹并启动可执行文件,而无需进行任何安装?
静态链接在这里不是一个选项,因为我将有一堆使用相同boost库的可执行文件,而且针对libgcc的静态链接也可能存在一些许可证问题。
3条答案
按热度按时间pokxtpni1#
在Ubuntu上,也许标准的打包方式是遵循DEBIAN规则:
在包含CPack之前,通过设置CPACK_DEBIAN_PACKAGE_DEPENDS指定依赖关系,而不是重新分发so文件,请看以下示例:
https://github.com/thomas-moulard/visp-deb/blob/master/CMakeModules/CPackConfigDeb.cmake
dpkg将自动为你安装相关的软件包。
avwztpqn2#
尝试在发行包中包含所需的库是完全有效的。
在cmake文件中,我这样做的方法是使用
ldd
从可执行文件中提取库名称,然后解析链接,然后将结果复制到我的包中:从可执行文件中提取库名称
解析链接
将库复制到包中
g52tjvyc3#
您需要添加将库复制到程序包中的安装规则。否则,
.so
文件不会复制到目标。因此,尝试以下(适应您的需求):
更多信息:read about CMake install rules