如何阻止CPack(productbuild生成器)修改并使二进制文件签名失效?
解决方案
方法一:提前配置正确路径,让CPack无需修改文件
在CMake构建阶段,为你的bundle目标设置匹配最终打包结构的路径属性,确保安装后的二进制文件RPATH、库名称完全符合运行要求,这样CPack就不会触发install_name_tool修改:
# 针对你的myprod目标设置路径属性 set_target_properties(myprod PROPERTIES # 构建阶段的临时RPATH,适配开发环境 BUILD_RPATH "@loader_path/../Frameworks" # 安装后的RPATH,与打包后实际运行路径一致 INSTALL_RPATH "@loader_path/../Frameworks" # 将共享库的安装名称设为@rpath,避免硬编码固定路径 INSTALL_NAME_DIR "@rpath" )
同时确保CMake安装路径与CPack打包路径匹配,比如:
set(CMAKE_INSTALL_PREFIX "/Library/Application Support/Mycompany" CACHE PATH "安装前缀")
路径完全匹配后,CPack无需调整文件路径,自然不会修改二进制文件。
方法二:强制禁用CPack的路径修改行为
如果方法一无法生效,可通过CMake变量跳过安装阶段的RPATH自动调整:
# 跳过安装时自动修改RPATH的逻辑 set(CMAKE_SKIP_INSTALL_RPATH ON) # 或者禁止CMake使用链接路径生成安装RPATH set(CMAKE_INSTALL_RPATH_USE_LINK_PATH OFF)
注意:使用该方法前必须手动配置好正确的RPATH,否则会导致程序运行时找不到依赖库。
备选方案:CPack修改后重新签名
如果无法避免CPack调用install_name_tool,可以通过CPACK_POST_INSTALL_SCRIPT指定签名脚本,在CPack完成安装(文件修改后)、打包前重新签名:
- 创建签名脚本
resign.sh:
#!/bin/bash # 替换为你的签名身份和目标文件路径 SIGN_IDENTITY="Developer ID Application: 你的公司名称 (XXXXXX)" TARGET_FILE="${CPACK_TEMP_INSTALL_DIRECTORY}/Library/Application Support/Mycompany/myprod.plugin/Contents/MacOS/myprod" codesign --force --sign "$SIGN_IDENTITY" "$TARGET_FILE"
- 在CMakeLists.txt中配置脚本路径:
set(CPACK_POST_INSTALL_SCRIPT "${CMAKE_SOURCE_DIR}/resign.sh")
这样CPack会在安装完成后自动执行签名,修复被破坏的代码签名。
内容的提问来源于stack exchange,提问作者GaryO
相关产品推荐
相关产品推荐

