C++20学习:基于Ubuntu系统编译gcc10.2.0

本文介绍了如何在Ubuntu 20.04系统上手动编译GCC 10.2.0以获取C++20支持。作者详细阐述了从下载源码、解压、安装依赖到编译和安装的步骤,并分享了使用新编译器测试C++20概念代码的过程,展示了概念在错误检查中的作用。
摘要由CSDN通过智能技术生成

问题

c++20标准已经发布,c++20有比较多的新特性。想尝个先,虽然目前还没有一个编译器能够完全支持c++20标准。gcc和clang编译支持c++20多一些,gcc支持最好。

安装Ubuntu系统20.0.4,自带的gcc都还不支持c++20。需要使用最新的gcc10.2.0版本,需要编译。于是自己动手。

编译gcc

  • 1.下载最新的gcc10.2.0
    访问:https://gcc.gnu.org/mirrors.html,找个镜像金星下载gcc

  • 2.解压缩

我下载的是xz文件,需要先试用xz解压成tar包,然后再使用tar进行解压:

xz -d gcc-10.2.0.tar.xz
tar xvf gcc-10.2.0.tar
  • 3.下载依赖包
    gcc会依赖gmp.mpfr和mpc几个包,如果有网络,可以直接自带的脚本自动下载,然后编译。
cd gcc-10.2.0
./contrib/download_prerequisites
  • 4.编译
cd ..
mkdir gcc-build-10.2.0
cd gcc-build-10.2.0
../gcc-10.2.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

我只用到c和c++,所以只编译这两种语言的编译器。下面是make

make -j4

开4个线程同时编译,接下来是漫长的等待。我使用笔记本上虚拟的4U4G的vm进行编译,将近40分钟,cpu温度90左右。不得不承认,gcc现在确实太庞大了。

  • 5.安装
sudo make install
  • 6.检查版本
g++ --version
g++ (GCC) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

测试c++20特性

简单写了一个concept的代码,保存成main.cpp,代码如下:

#include <iostream>

template<typename  T>struct is_integer;

template<>
struct is_integer<int>{
    typedef int type;
};

template<typename T>
concept IsInteger = requires(T){
    typename  is_integer<T>::type;
};

template<IsInteger T>
T add(T a, T b){
    return a+b;
}

int main(int argc, const char * argv[]) {
    using namespace std;
    cout << add(1,2) << endl;
    cout << add(1.0, 2.0)<< endl;
    return 0;
}

编译输出:

g++ main.cpp -std=c++2a -o a.out
main.cpp: In function ‘int main(int, const char**)’:
main.cpp:23:25: error: use of function ‘T add(T, T) [with T = double]’ with unsatisfied constraints
   23 |     cout << add(1.0, 2.0)<< endl;
      |                         ^
main.cpp:16:3: note: declared here
   16 | T add(T a, T b){
      |   ^~~
main.cpp:16:3: note: constraints not satisfied
main.cpp: In instantiation of ‘T add(T, T) [with T = double]’:
main.cpp:23:25:   required from here
main.cpp:11:9:   required for the satisfaction of ‘IsInteger<T>[with T = double]
main.cpp:11:21:   in requirements with ‘T <anonymous>[with T = double]
main.cpp:12:15: note: the required type ‘typename is_integer<T>::type’ is invalid
   12 |     typename  is_integer<T>::type;
      |     ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
cc1plus: note: set ‘-fconcepts-diagnostics-depth=’ to at least 2 for more detail

从结果可以参数,代码cout << add(1.0, 2.0)<< endl;如逾期的那样不符合concept的要求,编译不通过。

讨论

由于用的是vm,编译出来的gcc,我直接覆盖了系统自带的gcc版本。即使有问题,重新做一个vm就行了,所以没有弄新老gcc并存。

如果你用的是Ubuntu系统,可以直接使用apt-get进行安装gcc,不过可能不是最新的版本,只是最近一次稳定的版本。

sudo apt-get install gcc-10
sudo apt-get install g++10
g++-10 --version
g++-10 (Ubuntu 10.2.0-5ubuntu1~20.04) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

c++20标准目前比较新,没有编译器完全支持。微软的vs又太庞大了,弄个gcc来学习还是蛮简单的。gcc的编译,还是比简单,gcc4.0版本时就自己动手编译过,没想到过了五六年,之前的编译方法依然可以使用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值