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

如何让CMake自动签名所有MacOS可执行目标以启用核心转储?

MacOS下CMake自动签名可执行目标以支持核心转储

MacOS中,可执行文件必须签名才能生成核心转储。针对层级化CMake项目,可通过根目录配置实现自动签名所有可执行目标,无需修改子目录的CMakeLists.txt。

准备工作

将以下内容保存为segv.entitlements并加入代码仓库(建议放在项目根目录的cmake/子目录下):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.get-task-allow</key>
    <true/>
</dict>
</plist>

根目录CMake配置

在项目根目录的CMakeLists.txt中添加以下代码,仅在MacOS环境下触发签名流程:

if(APPLE)
    # 指定entitlements文件路径,根据实际存放位置调整
    set(CORE_DUMP_ENTITLEMENTS "${PROJECT_SOURCE_DIR}/cmake/segv.entitlements")

    # 定义自动签名函数,仅处理可执行目标
    function(auto_sign_for_core_dump target)
        get_target_property(target_type ${target} TYPE)
        if(target_type STREQUAL "EXECUTABLE")
            add_custom_command(TARGET ${target} POST_BUILD
                COMMAND codesign -s - -f --entitlements "${CORE_DUMP_ENTITLEMENTS}" "$<TARGET_FILE:${target}>"
                COMMENT "Signing ${target} to enable core dumps on MacOS"
                VERBATIM
            )
        endif()
    endfunction()

    # 为已定义的所有目标应用签名
    get_all_targets(all_project_targets)
    foreach(target IN LISTS all_project_targets)
        auto_sign_for_core_dump(${target})
    endforeach()

    # 处理后续新增的目标(可选,确保动态添加的目标也被签名)
    add_custom_target(auto_sign_all ALL)
    add_custom_command(TARGET auto_sign_all PRE_BUILD
        COMMAND ${CMAKE_COMMAND} -D "ENTITLEMENTS_FILE=${CORE_DUMP_ENTITLEMENTS}" -P "${PROJECT_SOURCE_DIR}/cmake/sign_all_targets.cmake"
        VERBATIM
    )
endif()

辅助脚本(可选)

若需要确保后续动态添加的目标也能被签名,在cmake/目录下创建sign_all_targets.cmake:

get_all_targets(all_targets)
foreach(target IN LISTS all_targets)
    get_target_property(target_type ${target} TYPE)
    if(target_type STREQUAL "EXECUTABLE")
        execute_process(
            COMMAND codesign -s - -f --entitlements "${ENTITLEMENTS_FILE}" "$<TARGET_FILE:${target}>"
            RESULT_VARIABLE sign_result
        )
        if(sign_result EQUAL 0)
            message(STATUS "Successfully signed ${target} for core dump support")
        else()
            message(WARNING "Failed to sign ${target}")
        endif()
    endif()
endforeach()

关键说明

  • 该配置仅在MacOS下生效,完全不影响Linux生产环境的构建流程。
  • 无需修改任何子目录的CMakeLists.txt,根目录配置会自动遍历所有可执行目标。
  • codesign -s -使用自签名证书,完全满足开发环境需求,无需额外申请证书。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:00:59