gpt4 book ai didi

cmake - CMake 变量和属性之间有什么区别?

转载 作者:行者123 更新时间:2023-12-04 14:38:42 30 4
gpt4 key购买 nike

CMake 变量和属性似乎完成了非常相似的事情,我一直无法理解它们之间的区别。

它们每个都有自己的文档部分,但两者都会影响构建系统,两者都是“预先存在的”,并且两者都可以基于其他 CMake 命令动态生成。看起来他们应该有不同的目的。他们是什么?

最佳答案

一个非常简短的思考方式是,属性是作用域为目标的变量。例如:

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};

因为属性是目标的一部分而不是全局变量,这也意味着它们可以被导出。对我的一个项目进行 sanitizer :
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 )中添加一些东西,并且有一些它关心的源文件(我的头文件, INTERFACE_SOURCES )。

关于cmake - CMake 变量和属性之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49958208/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com