在CMake中引入最低的C ++标准版本

马拉特

CMake有一个很好的框架,用于设置和定义C ++标准显式值,通常是:

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)

但这显然不能满足我的需求,我宁愿声明我至少需要c ++ 11。我以为我可以代替:

$ cat CMakeLists.txt 
cmake_minimum_required(VERSION 3.7)
project(p CXX)
set(CMAKE_CXX_EXTENSIONS OFF)
add_executable(foobar foobar.cxx)
target_compile_features(foobar PRIVATE cxx_nullptr)

哪里

$ cat foobar.cxx 
int main()
{
  char * p = nullptr;
}

但是在这种情况下,这再次迫使我使用-std=c++11默认情况下的g ++ 6.3.0-std=c++14(技术上默认-std=gnu++14):

$ c++ -dumpversion
6.3.0

造成:

$ make VERBOSE=1
[...]
make[2]: Entering directory '/tmp/p'
[ 50%] Building CXX object CMakeFiles/foobar.dir/foobar.cxx.o
/usr/bin/c++     -std=c++11 -o CMakeFiles/foobar.dir/foobar.cxx.o -c /tmp/p/foobar.cxx
[100%] Linking CXX executable foobar
/usr/bin/cmake -E cmake_link_script CMakeFiles/foobar.dir/link.txt --verbose=1

有没有办法说:在CMake中“至少使用C ++ 11标准构建此项目”?

通常,对于使用g ++ 4.8.5-std=c++11构建的项目,它会添加,但是对于使用g ++ 6.3.0构建的项目,它将保留默认值(隐式)-std=c++14


更新:以下内容超出了该问题的范围,但是由于我收到@ComicSansMS的冗长答复,因此我觉得需要澄清此问题。

我正在使用我的Debian Maintenanceer帽子,几个月前我被说服了,在项目中的cmake中设置显式的C ++标准版本是正确的方法,因此我的建议是:

但是,这里有两件事混杂在一起:

  1. 为要构建的库的接口定义c ++标准版本
  2. 为要构建的库的实现细节定义c ++标准版本。

从Debian Maintenanceer的角度来看,明确地设置C ++标准版本使得在更新库SONAME时很难重建软件包档案的一部分。让我们考虑一下GDCM使用Poppler库的情况。虽然GDCM的实现细节是使用C ++ 98编写的,但Poppler库是使用默认(隐式)标准版本的gcc-6构建的,这实际上使GDCM编译失败,因为-std=c++98已传递了显式信息

因此,对于预期的实现,设置显式的c ++标准版本是有意义的(显然!),而对于预期的接口,则不太清楚。绝大多数开源项目未定义多个c ++ ABI(std :: string [98]和std :: string [11]),并假定将使用单个版本来运送二进制文件。在这种情况下,使用默认(隐式)gcc版本(至少当以官方Debian软件包上传时)构建c ++软件包非常重要。

一些程序员哥们

您总是可以自己测试特定标准标志的存在。

首先检查-std=c++14,如果不存在,则检查-std=c++11,如果不起作用,则出错。

标志可以很容易地检查CheckCXXCompilerFlag模块


这些天,您可能应该从开始-std=c++17您可能还想添加对c++1z(C ++ 17)和c++1y(C ++ 14)等预发行标准版本的检查

从最高版本开始,然后逐步降低最低要求版本。当它没有失败时停止。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++标准版本与Visual Studio版本

获取Visual Studio使用的C ++标准版本

使用Bazel构建时如何设置C ++标准版本?

如何在DPC ++编译器选项中指定C ++标准版本?

.Net Core 2.2的.Net标准版本

更新Python使用的Unicode标准版本

在Windows 8标准版中关闭BitLocker。

SQL Server标准版中的群集ColumnStore索引

语言标准版本与编译器版本

是否有不支持`-E`的`sed`标准版本?

C ++模板声明中的范围和默认参数:澄清标准版

cfdocument标准版和企业版中的标签支持

SQL Server 2008 R2标准版中的数据库加密方法

标准版本和基本版本的Azure SQL数据库有什么区别

最低的CMake版本?

有没有办法使用标准版本来更新更改日志

为什么我的swap <string,string>比标准版本慢得多?

如何使用自定义reasteasy代替jboss标准版本

bash文件重定向到标准版本与Linux上的shell(`sh`)有何不同?

是否发布了C ++标准的新版本?

查找引入了哪个功能的CMake版本

SQL Server Web与标准版

升级 Server 2019 标准版

我的 VPS 提供商仅提供 Ubuntu 18.04 最小版本,但我需要标准版本——是否有简单的升级路径?

指定最低要求的C ++标准

如何在CMakeLists.txt中确定所需的最低CMake版本?

如果我必须同时针对Dot Net Core 3.0和.Net Framework 4.7.2,我应该在库中使用哪个.Net标准版本。

Bash pip 搜索检查版本包含在标准输出中

Java标准版中有几个类?