You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CPack生成的TGZ包缺失可执行文件,如何同时包含可执行文件与静态库?

问题:CPack生成TGZ包仅包含静态库,如何同时包含可执行文件与静态库?

我尝试使用CPack的TGZ生成器创建二进制软件包,期望包内包含可执行文件和依赖的静态库,但执行sudo make package后,生成的tar.gz文件里仅存在静态库。请问如何调整配置,让包同时包含可执行文件及其依赖的静态库?

项目文件内容

main.cpp

#include <iostream>

#include "math_lib/lib.h"

int main(int, char**){
    std::cout << "Hello, from cpack_demo!\n";
    std::cout << add(2, 3) << std::endl;
    std::cout << subtract(2, 3) << std::endl;
    std::cout << multiply(2, 3) << std::endl;
    std::cout << divide(2, 3) << std::endl;
}

根目录CMakeLists.txt

cmake_minimum_required(VERSION 3.10.0)
project(cpack_demo VERSION 0.1.0 LANGUAGES C CXX)

add_subdirectory(math_lib)
add_executable(cpack_demo main.cpp)
target_link_libraries(cpack_demo math_lib)

install(TARGETS cpack_demo RUNTIME DESTINATION /usr/local/bin)

# 设置CPack配置
set(CPACK_GENERATOR "TGZ") 
set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_DESCRIPTION "Cpack demo")

include(CPack)

math_lib/lib.h

int add(const int a, const int b);
int subtract(const int a, const int b);
int multiply(const int a, const int b);
int divide(const int a, const int b);

math_lib/lib.cpp

int add(const int a, const int b) {
    return a + b;
}

int subtract(const int a, const int b) {
    return a - b;
}

int multiply(const int a, const int b) {
    return a * b;
}

int divide(const int a, const int b) {
    return a / b;
}

math_lib/CMakeLists.txt

cmake_minimum_required(VERSION 3.10.0)
project(math_lib VERSION 0.1.0 LANGUAGES C CXX)

add_library(math_lib lib.h lib.cpp)

install(TARGETS math_lib RUNTIME DESTINATION /usr/local/lib)

执行命令

mkdir build
cd build
cmake ..
make
sudo make package

当前输出结果

tar -tvf cpack_demo-0.1.0-Linux.tar.gz
drwxr-xr-x root/root         0 2025-02-21 05:21 cpack_demo-0.1.0-Linux/lib/
-rw-r--r-- root/root      4110 2025-02-21 05:21 cpack_demo-0.1.0-Linux/lib/libmath_lib.a

修复方案

问题出在两个关键配置错误:

1. 绝对路径导致CPack忽略可执行文件的安装

根目录CMakeLists.txt中,install指令使用了绝对路径/usr/local/bin,CPack默认只会打包相对于CMAKE_INSTALL_PREFIX的相对路径内容,绝对路径的安装目标不会被包含进包内。

2. 静态库的安装类型指定错误

math_lib的CMakeLists.txt中,静态库属于ARCHIVE类型,但install指令用了仅对应动态库/可执行文件的RUNTIME参数,导致静态库的安装配置不符合规范(虽然当前输出中出现了静态库,但这是CMake的兼容行为,并非正确配置)。

修改后的配置文件

根目录CMakeLists.txt

cmake_minimum_required(VERSION 3.10.0)
project(cpack_demo VERSION 0.1.0 LANGUAGES C CXX)

add_subdirectory(math_lib)
add_executable(cpack_demo main.cpp)
target_link_libraries(cpack_demo math_lib)

# 使用相对路径,CPack会将可执行文件打包到包内的bin目录
install(TARGETS cpack_demo RUNTIME DESTINATION bin)

# 设置CPack配置
set(CPACK_GENERATOR "TGZ") 
set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_DESCRIPTION "Cpack demo")

include(CPack)

math_lib/CMakeLists.txt

cmake_minimum_required(VERSION 3.10.0)
project(math_lib VERSION 0.1.0 LANGUAGES C CXX)

add_library(math_lib lib.h lib.cpp)

# 静态库使用ARCHIVE类型,打包到包内的lib目录
install(TARGETS math_lib ARCHIVE DESTINATION lib)

重新执行命令

mkdir build && cd build
cmake ..
make
make package  # 无需sudo,CPack会自动将文件安装到临时目录后打包

此时生成的tar.gz文件将同时包含bin/cpack_demo可执行文件和lib/libmath_lib.a静态库。


内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:43:09