如何在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
相关产品推荐
相关产品推荐

