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

如何根据Debug/Release配置在CMakeLists中设置CMAKE_OSX_ARCHITECTURES

解决CMake仅在Release配置下设置OSX架构的问题

你的问题出在generator表达式无法在project()调用前使用——CMake在执行project()前还未初始化配置相关的上下文,无法解析$<CONFIG:>这类延迟计算的表达式,所以你的写法会失效。

下面分两种生成器场景给出可行方案:

1. 单配置生成器(Makefile、Ninja等)

这类生成器在cmake阶段就需要确定CMAKE_BUILD_TYPE,可以直接在project()前判断该变量的值:

# 在project()前判断构建类型,仅Release时设置架构
if(CMAKE_BUILD_TYPE STREQUAL "Release")
  set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64")
endif()

# 之后调用project
project(YourProjectName)

2. 多配置生成器(Xcode等)

这类生成器支持同时管理Debug/Release等多个配置,需要在project()之后通过配置专属变量或目标属性来设置:

方式一:全局配置(所有目标生效)

project(YourProjectName)

# 分别为Debug和Release配置设置架构
set(CMAKE_OSX_ARCHITECTURES_DEBUG "")
set(CMAKE_OSX_ARCHITECTURES_RELEASE "arm64;x86_64")

方式二:针对单个目标配置

如果只想给特定目标设置架构,可以用目标属性:

project(YourProjectName)

add_executable(YourTarget src/main.cpp)

# 为目标的不同配置指定架构
set_target_properties(YourTarget PROPERTIES
  OSX_ARCHITECTURES_DEBUG ""
  OSX_ARCHITECTURES_RELEASE "arm64;x86_64"
)

兼容单/多配置生成器的通用写法

如果需要同时支持两种生成器类型,可以结合两种逻辑:

# 处理单配置生成器
if(NOT CMAKE_CONFIGURATION_TYPES)
  if(CMAKE_BUILD_TYPE STREQUAL "Release")
    set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64")
  endif()
endif()

project(YourProjectName)

# 处理多配置生成器
if(CMAKE_CONFIGURATION_TYPES)
  set(CMAKE_OSX_ARCHITECTURES_DEBUG "")
  set(CMAKE_OSX_ARCHITECTURES_RELEASE "arm64;x86_64")
endif()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:05:10