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 ++标准版本是正确的方法,因此我的建议是:
但是,这里有两件事混杂在一起:
从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] 删除。
我来说两句