【发布时间】:2014-10-01 13:48:22
【问题描述】:
我编写了一个使用 boost 的简单 c++ 程序,我想将它部署在具有任何 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_system.so、libboost_chrono.so、libboost_program_options.so libstdc++.so libgcc_s.so libc.so librt.so libm.so
那些是我要打包的共享库(也许我不需要打包标准的)
我如何告诉 cmake 获取正确的共享对象库,并将它们放在可执行文件旁边,这样用户只需解压文件夹并启动可执行文件而无需任何安装?
这里不能选择静态链接,因为我会有一堆使用相同 boost 库的可执行文件,而且静态链接到 libgcc 时可能还会存在一些许可问题。
【问题讨论】:
-
我找到了复制所需依赖的脚本h3manth.com/content/copying-shared-library-dependencies手动部署(将so放在可执行文件旁边),但启动并不容易。首先我们必须删除标准依赖项,然后 chmod 711 *,然后将 ld_library_path 设置为应用程序和共享库所在的文件夹。最后程序运行,但它不是用户友好的。任何人都可以建议用户友好的部署吗?
-
回答部分我自己的评论,通过使用 set( CMAKE_EXE_LINKER_FLAGS "-Wl,-rpath='$ORIGIN' ") 似乎不再需要设置 ld_library_path 我仍然需要删除 linux -vdso.so, libpthread.so, libstdc++.so libgcc_s.so libc.so librt.so libm.so 让它运行。虽然它适用于我的机器(ubuntu 12.04 和 ubuntu 14.04),但我不确定它是否适用于任何相同架构的 linux 风格。
-
看来除了set(CMAKE_EXE_LINKER_FLAGS "-Wl,-rpath='$ORIGIN'")之外,set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)这行也是必须的
标签: c++ boost deployment packaging