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
相关产品推荐
相关产品推荐

