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

时间:2017-11-21 14:56:01

标签: cmake

在CMake中,假设一个人只是设置一个属性,那么

之间是否存在差异
set_target_properties(target PROPERTIES prop value)

set_property(TARGET target PROPERTY prop value)

比照。

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

这意味着没有区别,但并不清楚。

3 个答案:

答案 0 :(得分:8)

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}"
    )  
    

参考

答案 1 :(得分:5)

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

例如:

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

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

set_target_properties对比,您必须在其中指定目标及其属性及其值。

set_target_properties(target PROPERTIES CXX_STANDARD 11 ...)

希望这有帮助!

答案 2 :(得分:4)

请注意,对于其他一些类型的媒体资源,您还有set_*_properties个函数:set_source_files_propertiesset_directory_propertiesset_tests_properties。值得注意的是缺少安装和全局属性的设置器。

这样做的原因是这些函数早于一般set_property调用,这只是在CMake 2.6中引入的,同时对属性系统进行了一般性的改革。

现在,人们倾向于选择通用set_property,因为它是更现代的功能,并提供了一些额外的功能。它还提供比旧函数更一致的语法(例如。set_directory_properties不允许将目录指定为参数,set_source_file s vs set_director y 等)。

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