C++ C++;11用<;目标编译功能>;或<;设置(CMAKE\U CXX\U标准)>;

C++ C++;11用<;目标编译功能>;或<;设置(CMAKE\U CXX\U标准)>;,c++,c++11,cmake,C++,C++11,Cmake,我正在使用一个Python库,名为,专门用于物理建模。 为了节省计算过程中的模拟,它实现了C++代码生成功能。它使用CMake生成特定模拟的可执行文件 是在C++ 11中实现的。 问题 在CMAKLISTS.TXT文件中,C++ 11的特性由以下行激活: target_compile_features(<project_name> PUBLIC cxx_std_11) 在其他安装(Debian 8、Mac OSX或windows 7)上未遇到此错误 修复 我已经更改了CMakeL

我正在使用一个Python库,名为,专门用于物理建模。 为了节省计算过程中的模拟,它实现了C++代码生成功能。它使用CMake生成特定模拟的可执行文件

是在C++ 11中实现的。


问题

在CMAKLISTS.TXT文件中,C++ 11的特性由以下行激活:

target_compile_features(<project_name> PUBLIC cxx_std_11)
在其他安装(Debian 8、Mac OSX或windows 7)上未遇到此错误 修复

我已经更改了CMakeLists.txt模板。这里是到提交的链接,在我自己的fork上

我已经用
set(CMAKE\u cxx\u标准11)
替换了
target\u compile\u功能(PUBLIC cxx\u std\u 11)


问题

这两个命令之间有什么区别? 你对这件事有什么见解?我忘了提一些信息了吗


谢谢你的回答

您的
CMake
版本中没有
cxx\u std\u 11
编译器元功能。它是在
3.8
中引入的,因此这可以解释错误

两者的区别在于
target\u compile\u features()
可以为特定目标请求特定功能。CMake将自动将适当的标准应用于指定的目标。另一方面,如果您设置了
CMAKE\u CXX\u标准
,则请求的标准(如果CMAKE支持)将应用于整个项目(针对所有目标)

如上所述,您可以从
CMake 3.8
开始使用
target\u compile\u features()
请求一个完整的标准,在这种情况下,设置
CMake\u CXX\u标准的唯一区别是该标准仅应用于指定的目标(如下所示)


请注意,如果使用
PRIVATE
作用域调用
target\u compile\u features
,则如果设置了
PUBLIC
,则请求的特性/标准将仅应用于指定的目标,然后,请求的功能/标准也将应用于依赖于该目标的任何目标。

请注意,您还有目标属性:,与
-- The CXX compiler identification is GNU 5.4.0
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at CMakeLists.txt:31 (target_compile_features):
  target_compile_features specified unknown feature "cxx_std_11" for target
  "dampedosc".
```

-- Configuring incomplete, errors occurred!
See also "/home/victorw/git/vocal-phs/python/output/dampedosc/CMakeFiles/CMakeOutput.log".