CMake - 如何为目标可执行文件设置多个编译定义?

qiu*_*bit 14 cmake

我正在尝试为我尝试在CMake中编译的可执行文件之一设置多个编译定义(以激活用于调试的宏).这是我试过的:

add_executable (trie_io_test trie_io_test.c trie.c word_list.c)
    set_target_properties(
            trie_io_test
            PROPERTIES
            COMPILE_DEFINITIONS UNIT_TESTING=1)
    set_target_properties(
            trie_io_test
            PROPERTIES
            COMPILE_DEFINITIONS IO_TEST=1)
Run Code Online (Sandbox Code Playgroud)

不幸的是,这只会导致定义IO_TEST.

我也尝试过以下方法:

add_executable (trie_io_test trie_io_test.c trie.c word_list.c)
    set_target_properties(
            trie_io_test
            PROPERTIES
            COMPILE_DEFINITIONS UNIT_TESTING=1 IO_TEST=1)
Run Code Online (Sandbox Code Playgroud)

但另一方面,这会导致CMake错误.

如何为我正在尝试构建的可执行文件设置这两个定义?

Fra*_*ser 34

你想要target_compile_definitions而不是set_target_properties:

target_compile_definitions(trie_io_test PRIVATE UNIT_TESTING=1 IO_TEST=1)
Run Code Online (Sandbox Code Playgroud)

  • 我在答案中链接了文档,但它实际上只对库而不是exes有用.Libs可以将它们的编译标志定义为`PRIVATE`,`PUBLIC`或`INTERFACE`.`PRIVATE`基本上意味着标志仅适用于此库.`PUBLIC`和`INTERFACE`标志也适用于链接到它的任何目标(即它的dependees); 这两者之间的区别在于`INTERFACE`标志不适用于图书馆本身 - 只是它的依赖. (10认同)
  • PRIVATE仅将属性添加到此目标.INTERFACE将属性添加到链接到此目标的目标.PUBLIC充当PRIVATE和INTERFACE,因为它将属性添加到此目标和链接到此目标的目标. (2认同)
  • @einpoklum 是的,您可以多次调用它。 (2认同)

Che*_*hen 5

我发现这对你有用:

add_executable (trie_io_test trie_io_test.c trie.c word_list.c)
set_target_properties(
    trie_io_test
    PROPERTIES
    COMPILE_DEFINITIONS UNIT_TESTING=1
    COMPILE_DEFINITIONS IO_TEST=1
   )
Run Code Online (Sandbox Code Playgroud)

只需添加另一个COMPILE_DEFINITIONS:P

  • 与“set_source_files_properties()”一起使用时,它对我不起作用。第二个会覆盖第一个。 (2认同)