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

