CMake变量和属性似乎完成了非常相似的事情,我一直无法理解它们之间的区别。
它们各自都有自己的文档部分,但它们都会影响构建系统,它们都是“预先存在的”,并且都可以基于其他CMake命令动态生成。看起来他们应该有不同的目的。他们是什么?
发布于 2018-04-22 01:55:48
一个非常简短和简单的方式来考虑它是属性是变量作用域的目标。例如:
add_executable(foo foo.cpp)
set_target_properties(foo PROPERTIES
CXX_STANDARD 14
CXX_EXTENSIONS OFF
)
# Build foo with c++11 for some reason
add_executable(foo11 foo.cpp)
set_target_properties(foo11 PROPERTIES
CXX_STANDARD 11
CXX_EXTENSIONS OFF
)
如果CMakeLists.txt是用C++编写的,可能是这样的:
const char * src_files[] = { "foo.cpp" };
executable foo{src_files};
foo.setCxxStandard(14);
foo.setCxxExtensions(false);
executable foo11{src_files};
foo.setCxxStandard(11);
foo.setCxxExtensions(false);
如果我们使用变量来做这些事情,它看起来会更像这样:
// globals
int CMAKE_CXX_STANDARD = 14;
bool CMAKE_CXX_EXTENSIONS = false;
// later, in a function
const char * src_files[] = { "foo.cpp" };
executable foo{src_files}; // foo copies global settings
CMAKE_CXX_STANDARD = 11;
executable foo11{src_files};
由于属性是目标的一部分,而不是全局变量,这也意味着它们可以导出。清理rom是我的一个项目:
set_target_properties(Foo::bar PROPERTIES
INTERFACE_COMPILE_FEATURES "cxx_std_14"
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include/"
INTERFACE_SOURCES "${_IMPORT_PREFIX}/include/foo/bar.hpp"
)
这意味着如果您导入Foo::bar
(可能通过find_package(Foo)
之类的东西),您的项目已经知道链接到Foo::bar
的内容需要使用C++14 (INTERFACE_COMPILE_FEATURES
),它需要向包含路径(INTERFACE_INCLUDE_DIRECTORIES
)添加一些内容,并且它关心一些源文件(my headers,INTERFACE_SOURCES
)。
https://stackoverflow.com/questions/49958208
复制相似问题