CMake:set_property(TARGET ...)和set_target_properties之间有区别吗?

Moh*_*han 17 cmake

在CMake中,假设一个人只是设置一个属性,那么它们之间是否有任何区别

set_target_properties(target PROPERTIES prop value)
Run Code Online (Sandbox Code Playgroud)

set_property(TARGET target PROPERTY prop value)
Run Code Online (Sandbox Code Playgroud)

参看

https://cmake.org/cmake/help/v3.0/command/set_property.html https://cmake.org/cmake/help/v3.0/command/set_target_properties.html

这意味着没有区别,但不是那么清楚.

Flo*_*ian 12

考虑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"
    )
    
    Run Code Online (Sandbox Code Playgroud)
  • set_property(TARGET ...)可以APPEND列出APPEND_STRING目标的列表或基于字符串的属性.

    例如:

    add_executable(a ...)
    set_property(
        TARGET a
        APPEND PROPERTY
            INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}"
    )  
    
    Run Code Online (Sandbox Code Playgroud)

参考

  • `set_property` 也支持多个目标: `set_property(TARGET abc ...)` (2认同)

Chr*_*ris 6

不同之处在于set_property,您可以定义范围.set_property除了指定目标之外,您实际上有更多选项,例如在列表中指定源文件以具有特定属性.

例如:

set_property(SOURCE src1.cpp src2.cpp PROPERTY SKIP_AUTOMOC ...)
Run Code Online (Sandbox Code Playgroud)

这会将SKIP_AUTOMOC属性添加到列出的源文件中.(这适用于Qt,其中对象的Moc'ing自动发生,有时您不希望这样).

set_target_properties您必须指定目标和财产及其价值的地方形成对比.

set_target_properties(target PROPERTIES CXX_STANDARD 11 ...)
Run Code Online (Sandbox Code Playgroud)

希望这有帮助!


Com*_*sMS 5

请注意,您也有相应的set_*_properties一些其他类型的属性的功能:set_source_files_propertiesset_directory_propertiesset_tests_properties。值得注意的是缺少用于安装和全局属性的设置器。

这样做的原因是这些功能早于通用set_property调用(该调用仅在CMake 2.6中引入)以及对财产系统的总体检查到今天为止。

如今,人们倾向于使用泛型set_property,因为泛型是更现代的功能,并且提供了一些其他功能。与旧函数相比,它还提供了更一致的语法(例如,set_directory_properties不允许将目录指定为参数,set_source_file vs set_director y等)。

没有强烈的技术理由偏爱set_property,但是我认为它比使用旧的特定功能要好一些。