CMake安装/CPack打包问题:权限异常与调试符号丢失
CMake+CPack打包带调试符号且权限正确的RPM包
问题原因分析
- 权限异常:CMake默认
install命令给可执行文件的权限是755,但如果CPack RPM的权限模板被修改、或者你用自定义脚本复制文件而非CMake原生install,就会导致可执行位丢失;部分RPM打包规则会默认覆盖文件权限,也会造成部署后无法执行。 - 调试符号丢失:CPack RPM默认开启
CPACK_RPM_STRIP_FILES选项,会自动剥离可执行文件的调试符号;如果在install阶段误开启了CMAKE_INSTALL_DO_STRIP(Debug模式默认关闭,但可能被自定义配置覆盖),也会导致符号丢失。你修复权限时未同步关闭strip配置,因此出现符号丢失问题。
具体解决方案
1. 确保文件权限正确
优先使用CMake原生install命令显式指定权限,避免依赖默认值或自定义脚本:
# 安装可执行文件,显式设置755权限 install(TARGETS exec1 exec2 RUNTIME DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) # 安装配置文件,设置644权限 install(FILES config1.conf config2.json DESTINATION etc/your_project PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
如果必须用自定义脚本复制文件,要在脚本中显式设置权限:
chmod 755 ${INSTALL_DIR}/bin/* chmod 644 ${INSTALL_DIR}/etc/your_project/*
2. 强制保留调试符号
在CMakeLists.txt中显式关闭strip相关选项,确保Debug模式下符号不被剥离:
# 关闭CPack RPM的自动strip set(CPACK_RPM_STRIP_FILES OFF) # 确保Debug模式下安装时不strip符号(默认已关闭,显式设置避免意外) if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(CMAKE_INSTALL_DO_STRIP OFF) # 强制添加调试符号编译选项(避免自定义flags覆盖默认设置) add_compile_options(-g) add_link_options(-g) endif()
3. 验证打包结果
打包前后分别检查文件状态,确保权限和符号都符合要求:
# 编译安装后,检查本地安装目录的文件 ls -l ${CMAKE_INSTALL_PREFIX}/bin/exec1 file ${CMAKE_INSTALL_PREFIX}/bin/exec1 # 输出应包含"with debug_info" # 打包后,提取RPM包验证 rpm2cpio your-project-1.0.0.x86_64.rpm | cpio -idmv ls -l ./bin/exec1 file ./bin/exec1
内容的提问来源于stack exchange,提问作者John Smith V
相关产品推荐
相关产品推荐

