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

如何在CMake中实现安装后codesign,解决macOS程序启动报错?

问题描述

我有一个用CMake构建的简单C++应用程序。在macOS系统中,通过以下配置可让程序崩溃时生成core dump:

add_custom_command(TARGET mytarget POST_BUILD
    COMMAND /usr/libexec/PlistBuddy -c "Add :com.apple.security.get-task-allow bool true" coredump.entitlements
    COMMAND codesign -s - -f --entitlements coredump.entitlements $<TARGET_FILE:mytarget>
    COMMAND rm -f coredump.entitlements
    VERBATIM)

该配置对构建目录下的程序(如运行./build/bin/mytarget)有效,但执行make install后,安装的程序无法启动,报错:Killed: 9。需要解决的问题是:如何在CMake安装后重新执行codesign步骤,或让初始签名在make install后保持有效?

解决方案

方法1:在安装后执行签名

直接针对POST_INSTALL阶段添加签名逻辑,确保安装完成后对目标文件重新签名:

# 先定义基础安装规则
install(TARGETS mytarget DESTINATION bin)

# 添加安装后的签名步骤
add_custom_command(TARGET mytarget POST_INSTALL
    COMMAND /usr/libexec/PlistBuddy -c "Add :com.apple.security.get-task-allow bool true" "${CMAKE_CURRENT_BINARY_DIR}/coredump_install.entitlements"
    COMMAND codesign -s - -f --entitlements "${CMAKE_CURRENT_BINARY_DIR}/coredump_install.entitlements" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/mytarget"
    COMMAND rm -f "${CMAKE_CURRENT_BINARY_DIR}/coredump_install.entitlements"
    VERBATIM)

这里$ENV{DESTDIR}是CMake安装时的前缀变量,能准确定位到安装后的可执行文件路径。

方法2:直接安装已签名的构建产物

避免CMake在install阶段重新处理目标文件,直接复制构建目录中已完成签名的可执行文件:

# 替代默认的TARGETS安装方式,直接复制签名后的文件
install(
    FILES $<TARGET_FILE:mytarget>
    DESTINATION bin
    PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ
)

这种方式依赖于POST_BUILD阶段已经完成签名,确保复制的是未被修改的签名后文件,防止签名因重新编译或文件处理失效。

原因说明

Killed: 9报错本质是macOS代码签名验证失败。程序被复制到安装路径后,原签名可能因文件路径变更、CMake在安装阶段的隐式文件修改而失效,因此需要在安装后重新签名,或确保安装的是完整的签名产物。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 03:15:19