使用带有cmake/cpack的boost库打包c++程序

5kgi1eie  于 2023-02-20  发布在  其他
关注(0)|答案(3)|浏览(193)

我已经写了一个简单的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的静态链接也可能存在一些许可证问题。

pokxtpni

pokxtpni1#

在Ubuntu上,也许标准的打包方式是遵循DEBIAN规则:
在包含CPack之前,通过设置CPACK_DEBIAN_PACKAGE_DEPENDS指定依赖关系,而不是重新分发so文件,请看以下示例:
https://github.com/thomas-moulard/visp-deb/blob/master/CMakeModules/CPackConfigDeb.cmake
dpkg将自动为你安装相关的软件包。

avwztpqn

avwztpqn2#

尝试在发行包中包含所需的库是完全有效的。
在cmake文件中,我这样做的方法是使用ldd从可执行文件中提取库名称,然后解析链接,然后将结果复制到我的包中:

从可执行文件中提取库名称

execute_process(  # Get interesting dynamic libraries from binary
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin
    COMMAND ldd ${APPLICATION_NAME}
    COMMAND nawk "{print $3}"
    COMMAND sort -u
    COMMAND egrep "std|boost|ssl|crypto|z|mysql|sqlite" # Only libs I want to copy
    OUTPUT_VARIABLE INSTALL_FILES
    ERROR_VARIABLE INSTALL_FILES_ERROR
    OUTPUT_STRIP_TRAILING_WHITESPACE
    )

string(REGEX REPLACE "\n" ";" INSTALL_FILES "${INSTALL_FILES}") # Convert into list

message(" ----> ${INSTALL_FILES}")

if (${INSTALL_FILES_ERROR})
    message("----> ${INSTALL_FILES_ERROR}")
endif (${INSTALL_FILES_ERROR})

解析链接

foreach (_file ${INSTALL_FILES}) # Resolve links
    get_filename_component(_resolvedFile "${_file}" REALPATH)
    list (APPEND INSTALL_RESOLVED_FILES ${_resolvedFile} )
endforeach()

将库复制到包中

install(FILES                               # Copy all libraries and symlinks pointing to real paths
    ${INSTALL_FILES}
    DESTINATION "${PROJECT_VERSION}/lib/"
    COMPONENT core
    )
install(FILES                               # Copy all libraries real paths
    ${INSTALL_RESOLVED_FILES}
    DESTINATION "${PROJECT_VERSION}/lib/"
    COMPONENT core
    )
g52tjvyc

g52tjvyc3#

您需要添加将库复制到程序包中的安装规则。否则,.so文件不会复制到目标。
因此,尝试以下(适应您的需求):

install(TARGETS targets... RUNTIME_DEPENDENCIES DIRECTORIES ${Boost_LIBRARIES})

更多信息:read about CMake install rules

相关问题