【问题标题】:CMake - how to set multiple compile definitions for target executable?CMake - 如何为目标可执行文件设置多个编译定义?
【发布时间】:2015-05-30 13:17:39
【问题描述】:

我正在尝试为我尝试在 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)

很遗憾,这只会导致定义 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)

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

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

【问题讨论】:

    标签: cmake


    【解决方案1】:

    你想要target_compile_definitions 而不是set_target_properties

    target_compile_definitions(trie_io_test PRIVATE UNIT_TESTING=1 IO_TEST=1)
    

    【讨论】:

    • 我在回答中链接到了文档,但它实际上只对库有用,而不是对 exe 有用。库可以将它们的编译标志定义为PRIVATEPUBLICINTERFACEPRIVATE 基本上意味着这些标志只应用于这个库。 PUBLICINTERFACE 标志也适用于链接到它的任何目标(即它的依赖项);这两者之间的区别在于 INTERFACE 标志不应用于库本身 - 仅应用于它的依赖项。
    • 谢谢,作为参考,这是对我的问题“在这种情况下 PRIVATE 是什么意思?”的回答。我删除了,因为我在提出问题后看到有一个文档链接。
    • PRIVATE 仅将属性添加到此目标。 INTERFACE 将属性添加到链接到此目标的目标。 PUBLIC 既充当 PRIVATE 又充当 INTERFACE,因为它将属性添加到此目标和链接到此目标的目标。
    • 我无法在它们上设置optimizeddebug。可以使用生成器表达式,但我不确定是否有适用于构建配置的表达式?
    • @einpoklum 是的,你可以多次调用它。
    【解决方案2】:

    我发现这对你有用:

    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
       )
    

    只需添加另一个COMPILE_DEFINITIONS :P

    【讨论】:

    • set_source_files_properties() 一起使用时它对我不起作用。第二个覆盖第一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2019-09-05
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2020-12-22
    相关资源
    最近更新 更多