CMake:target_compile_options() 与 target_compile_definitions()

CMake : target_compile_options() vs target_compile_definitions()

target_compile_options()target_compile_definitions() 有什么区别?

根据 CMake 文档:

target_compile_options - 添加选项到 COMPILE_OPTIONSINTERFACE_COMPILE_OPTIONS 目标属性。

target_compile_definitions - 需要 INTERFACEPUBLICPRIVATE 关键字来指定以下参数的范围。 PRIVATEPUBLIC 项将填充 <target>COMPILE_DEFINITIONS 属性。 PUBLICINTERFACE 项将填充 <target>INTERFACE_COMPILE_DEFINITIONS 属性。

但我不知道使用哪一个以及何时使用。

使用 target_compile_definitions 定义预处理器宏,使用 target_compile_options 定义其他标志。

对于target_compile_definitions cmake 能够根据使用的编译器选择合适的编译器标志。此外,您可以节省 -D:

例子

target_compile_definitions(MyTarget PRIVATE
    ADD_DEBUG_PRINTS=1
    ABCDE
)

if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    target_compile_options(MyTarget PRIVATE -Wall)
endif()

注意-Wall的使用一般不要加在这个地方;它只是用作众所周知的编译器标志的示例...