CMake:set_property(TARGET...)和set_target_properties有什么区别吗?

41
3个回答

34

set_target_properties()视为set_property()的一种特殊形式。

...的优势

  • set_target_properties(...)是一种方便的函数,因为它允许设置多个目标的多个属性。

    例如:

    add_executable(a ...)
    add_executable(b ...)
    set_target_properties(
        a 
        b
        PROPERTIES 
            LINKER_LANGUAGE CXX
            FOLDER          "Executable"
    )
    
  • set_property(TARGET ...) 可以向目标的基于列表的属性 APPEND 元素,或者向字符串型属性 APPEND_STRING 字符串。

    例如:

    add_executable(a ...)
    set_property(
        TARGET a
        APPEND PROPERTY
            INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}"
    )  
    

参考资料


2
set_property supports multiple targets too: set_property(TARGET a b c ...) - Nikita Nemkin
@NikitaNemkin 欢迎提供任何实际的例子。 - John

10

不同之处在于使用set_property,您可以定义范围。与仅指定目标不同,set_property还提供了更多选项,例如在列表中指定源文件以具有特定属性。

例如:

set_property(SOURCE src1.cpp src2.cpp PROPERTY SKIP_AUTOMOC ...)

这将向列出的源文件添加SKIP_AUTOMOC属性。(这是为了Qt,其中对象的Moc'ing自动发生,有时您不希望这样做)。

set_target_properties相比,您必须指定目标、属性及其值。

set_target_properties(target PROPERTIES CXX_STANDARD 11 ...)

希望这可以帮助你!

9
请注意,对于其他类型的属性,您也有相应的set_*_properties函数: set_source_files_propertiesset_directory_propertiesset_tests_properties。值得注意的是,缺少安装和全局属性的设置器。
原因是这些函数早于通用的set_property调用,它仅在CMake 2.6与属性系统的整体改革一起引入。如今,人们倾向于使用通用的set_property,因为它是更现代的函数,并提供了一些附加功能。它还提供比旧函数更一致的语法(例如,set_directory_properties不允许将目录指定为参数,set_source_files与set_directory等)。
没有强烈的技术原因来选择set_property,但我认为它比使用旧的特定函数略好一些风格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接