如何在CMAKE中制作胖可执行文件?

t5fffqht  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(245)

我是CMAKE的新手。我正在尝试制作“胖可执行文件”。
我提到的fat可执行文件是一个可执行的二进制文件,它包含所有共享库,可以在另一个环境中运行。

示例(故障情况)

有一台我用来开发的计算机,有GCC,Boost库,librados等等。
这是一台计算机B,我希望它执行我构建的二进制文件。

  • 当然,A机和B机都有一些条件,相同的Intel CPU架构(i7),相同的CentOS。

我在ComputerA中使用CMAKE和cmake .. && make命令构建了二进制文件,然后将该文件复制到ComputerB并执行。
当我在计算机B中执行复制的二进制文件时,它显示如下。

[root@ComputerB ~]# ./binaryFile 123.123.123.123
./binaryFile: error while loading shared libraries: libboost_json.so.1.80.0: cannot open shared object file: No such file or directory

我知道这个错误消息是什么意思。没有它需要的共享库。所以,我想在这个社区里问的是,什么是包含共享库的CMAKE命令

类似的事情:胖JAR

我之所以叫“胖可执行文件”,是因为有a word "fat JAR" in Java,我对Java不熟悉,但它是Java社区常用的词。

我的CMAKE文件

它包含一些像Boost,Rados,RBD等库(根据开发进度会有更多)

cmake_minimum_required(VERSION 3.2.0)
project(BinaryHelper VERSION 0.1.0)

find_package(Boost REQUIRED COMPONENTS json)
include_directories(${Boost_INCLUDE_DIR})

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lrados -std=c++17")

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)

add_executable(
    ${PROJECT_NAME}
    main.cpp
    utils/binary.cpp
    utils/message.cpp
    utils/header.cpp
)

target_link_libraries (
    ${PROJECT_NAME}
    ${Boost_LIBRARIES}
    rados
    rbd
    Threads::Threads
)
7kqas0il

7kqas0il1#

多亏了@HolyBlackCat,我用静态链接解决了这个问题。

已修改的CMAKE

cmake_minimum_required(VERSION 3.2.0)
project(BinaryHelper VERSION 0.1.0)

find_package(Boost REQUIRED COMPONENTS json)
include_directories(${Boost_INCLUDE_DIR})

set(Boost_USE_STATIC_LIBS   ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lrados -std=c++17")

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)

add_library(
    boost_json
    STATIC
    IMPORTED
)

set_target_properties(
    boost_json
    PROPERTIES
    IMPORTED_LOCATION /usr/local/lib/libboost_json.a
)

add_executable(
    ${PROJECT_NAME}
    main.cpp
    utils/binary.cpp
    utils/message.cpp
    utils/header.cpp
)

# target_link_libraries (

# ${PROJECT_NAME}

# ${Boost_LIBRARIES}

# rados

# rbd

# Threads::Threads

# )

target_link_libraries(
    ${PROJECT_NAME}
    boost_json
    rados
    rbd
    Threads::Threads
)

还有其他(修改过的)关键字add_libraryset_target_propertiestarget_link_libraries

相关问题