如何让set_target_properties的COMPILE_FLAGS仅作用于编译器而非汇编器?
解决CMake中编译标志仅应用于C编译器而非汇编器的问题
这个问题很常见——当你用COMPILE_FLAGS设置通用编译选项时,CMake会把这些标志传递给所有参与编译的工具,包括汇编器,而汇编器自然不认识C语言的--std=c99标志。这里有几种可靠的解决方法,按推荐程度排序:
方法1:使用CMake内置的C语言标准属性(最推荐)
CMake提供了专门的属性来设置C语言标准,这种方式既跨平台,又不会把标志传递给汇编器:
set_target_properties(${TARGET_BASENAME_A} PROPERTIES C_STANDARD 99 C_STANDARD_REQUIRED ON )
C_STANDARD 99告诉CMake我们要使用C99标准,C_STANDARD_REQUIRED ON则强制要求编译器必须支持这个标准,否则会报错。CMake会自动根据你使用的编译器生成对应的标准标志(比如GCC的--std=c99),而且只会传递给C编译器。
方法2:使用目标专属的C编译标志
如果你更倾向于手动指定标志,可以用C_COMPILE_FLAGS代替通用的COMPILE_FLAGS,这个属性只会应用于C语言的编译步骤:
set_target_properties(${TARGET_BASENAME_A} PROPERTIES C_COMPILE_FLAGS "--std=c99")
方法3:用生成器表达式精准控制(现代CMake风格)
使用target_compile_options配合生成器表达式,让标志仅在编译C语言文件时生效:
target_compile_options(${TARGET_BASENAME_A} PRIVATE $<COMPILE_LANGUAGE:C>:-std=c99)
这里的$<COMPILE_LANGUAGE:C>是一个生成器表达式,只有当当前编译的文件是C语言时,才会添加后面的-std=c99标志。PRIVATE表示这个选项仅对当前目标生效,不会传递给依赖它的目标(你可以根据需求换成PUBLIC或INTERFACE)。
总结一下,优先用方法1,它是CMake推荐的标准做法,兼容性和可维护性最好;如果需要手动指定标志,方法2或3都能解决你的问题,避免汇编器拿到不认识的选项。
内容的提问来源于stack exchange,提问作者PizzaBeer
相关产品推荐
相关产品推荐

