当我在 CMake 中使用
add_definitions(-DENABLE_SOMETHING)
或 add_compile_definitions(-DENABLE_SOMETHING)
生成 Xcode 项目时,它将适用于构建设置中的所有拱门。如下所示:
如何对特定架构使用 add_definitions 或 add_compile_definitions ,如下所示:
因为我想为arm64和armv7定义不同的宏。
我尝试附加或设置 xcode 属性 XCODE_ATTRIBUTE_GCC_PREPROCESSOR_DEFINITIONS[arch=arm64],但它将覆盖之前生成的值,只保留新宏。
我知道有一个简单的方法可以解决这个问题,通过使用不同的架构生成两次 xcode 项目,就像这样
cmake . -G Xcode -DARCHS="armv7"
cmake . -G Xcode -DARCHS="arm64"
但我想知道如何解决这个问题,避免运行命令两次。
XCODE_ATTRIBUTE_<an-attribute>
目标属性是正确的。文档说它接受生成器表达式,所以也许你可以做这样的事情?
# early on:
set_property(
TARGET MyApp
PROPERTY XCODE_ATTRIBUTE_GCC_PREPROCESSOR_DEFINITIONS[arch=arm64]
"$<JOIN:$<TARGET_PROPERTY:MyApp,COMPILE_DEFINITIONS>;$<TARGET_PROPERTY:MyApp,ARM64_COMPILE_DEFINITIONS>, >"
)
# later on:
if (CMAKE_GENERATOR MATCHES "Xcode")
set_property(TARGET MyApp APPEND PROPERTY ARM64_COMPILE_DEFINITIONS ENABLE_SOMETHING)
elseif (ARCHS MATCHES "arm64")
target_compile_definitions(MyApp PRIVATE ENABLE_SOMETHING)
endif ()
这里的想法是,您可以获得通常的编译定义(通过生成器表达式),以及添加到 自定义属性
ARM64_COMPILE_DEFINITIONS
的定义。
回答我的问题。 我放弃了寻找纯 cmake 的方法来解决这个问题,并在 arch 宏中使用编译器(llvm 或 gcc)来找出它是哪个 arch。
#if defined(__aarch64__) // arm64
#define MACRO_FOR_ARM64
#elif defined(__arm__) // armv7
#define MACRO_FOR_ARMV7
#endif
我在一个通用头文件中定义了它,它将包含在我想要使用该宏的任何文件中。