首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CMake变量和属性有什么不同?

CMake变量和属性有什么不同?
EN

Stack Overflow用户
提问于 2018-04-22 01:06:18
回答 3查看 2.4K关注 0票数 12

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

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

EN

Stack Overflow用户

发布于 2018-04-22 01:55:48

一个非常简短和简单的方式来考虑它是属性是变量作用域的目标。例如:

代码语言:javascript
运行
复制
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++编写的,可能是这样的:

代码语言:javascript
运行
复制
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);

如果我们使用变量来做这些事情,它看起来会更像这样:

代码语言:javascript
运行
复制
// 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是我的一个项目:

代码语言:javascript
运行
复制
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)。

票数 11
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49958208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档