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

如何阻止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完成安装(文件修改后)、打包前重新签名:

  1. 创建签名脚本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"
  1. 在CMakeLists.txt中配置脚本路径:
set(CPACK_POST_INSTALL_SCRIPT "${CMAKE_SOURCE_DIR}/resign.sh")

这样CPack会在安装完成后自动执行签名,修复被破坏的代码签名。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:05:04