必须显式配置cpack_debian_package_maintainer,否则cpack -g deb因缺失强制字段“维护者信息(姓名+邮箱)”而报错退出;该字段不可推导、不可为空,格式须为"name ",且install()命令决定deb包实际内容。

必须显式配置 CPACK_DEBIAN_PACKAGE_MAINTAINER,否则 cpack -G DEB 会直接失败退出。
为什么 cpack -G DEB 报错 “maintainer not set”
Debian 包规范强制要求维护者信息(邮箱 + 姓名),CPack 不会自动推导或留空。常见错误是只设了 CPACK_PACKAGE_VERSION 却漏掉维护者字段。
-
CPACK_DEBIAN_PACKAGE_MAINTAINER必须形如"Your Name <your>"</your>,引号不能省 - 若用
find_package(Debian)或自定义 deb 规则,仍需该字段——CPack 的 DEB 生成器不读取外部配置 - 错误示例:
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "me")→ 缺少邮箱格式,cpack拒绝生成
install() 规则决定 deb 包里有什么
Debian 包内容完全由 install() 命令声明的文件决定,不是构建产物自动打包。没写 install(TARGETS ...) 就等于打包了个空包。
- 可执行文件用
RUNTIME DESTINATION bin(对应/usr/bin) - 动态库用
LIBRARY DESTINATION lib(对应/usr/lib),静态库用ARCHIVE DESTINATION lib - 头文件必须显式
install(FILES ... DESTINATION include),否则dev子包不会生成 - 配置文件建议走
install(FILES ... DESTINATION etc),Debian 支持自动处理/etc下的 conffiles
Debian 包名和版本号怎么控制
CPACK_PACKAGE_NAME 和 CPACK_PACKAGE_VERSION 直接映射到 debian/control 中的 Package: 和 Version: 字段,拼写/格式错一个字符都会导致 lintian 报警。
-
CPACK_PACKAGE_NAME应全小写、不含下划线(如myapp),Debian 政策禁止大写字母和_ -
CPACK_PACKAGE_VERSION必须符合 Debian 版本格式:数字+点+数字为主版本,可加~或+修饰(如1.2.0~git20260724),不能用v1.2.0 - 避免从
project(VERSION ...)直接赋值,CMake 不做校验;建议中间清洗:string(REPLACE "v" "" CLEANED_VER ${PROJECT_VERSION})
依赖项怎么声明才被正确识别
CPack 默认不扫描二进制依赖,libstdc++ 或 libboost_filesystem 这类库不会自动写入 Depends: 字段,必须手动声明。
- 用
CPACK_DEBIAN_PACKAGE_DEPENDS显式列出运行时依赖,格式为"libboost-filesystem1.78, libc6 (>= 2.31)" - 开发包(-dev)需单独配置
CPACK_DEBIAN_PACKAGE_SECTION为libdevel,并确保头文件和静态库已通过install()声明 - 若项目链接了系统库(如
pthread),不用写进Depends——Debian 基础库默认满足
真正麻烦的是跨架构兼容性:CPACK_DEBIAN_ARCHITECTURE 默认读 CMAKE_SYSTEM_PROCESSOR,但 arm64 和 aarch64 在 Debian 侧含义不同,必须手动映射成 arm64 才能过 lintian 检查。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











