这篇文章上次修改于 2016 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
GCC 7.3.0
备注: 以下操作均是在root用户下进行,可以执行前先使用 su
命令提升到 root
权限,或在执行 make install
命令时使用 sudo make install
临时提升权限执行。其后续操作也需要增加 sudo
指令。
## 使用root权限
su
# 安装相关依赖库
## 安装zlib库
yum install zlib-devel
## gmp 编译安装
cd /opt
wget http://ftp.gnu.org/pub/gnu/gmp/gmp-6.1.2.tar.xz
xz -d gmp-6.1.2.tar.xz
tar -xvf ./gmp-6.1.2.tar
cd gmp-6.1.2
./configure -prefix=/usr ;make && make install
## mfpr 编译安装
cd /opt
wget https://www.mpfr.org/mpfr-4.0.2/mpfr-4.0.2.tar.gz
tar -xzvf mpfr-4.0.2.tar.gz
cd mpfr-4.0.2/
./configure -prefix=/usr ;make && make install
## mpc 编译安装
cd /opt
wget http://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz
tar -xzvf mpc-1.1.0.tar.gz
cd mpc-1.1.0/
./configure -prefix=/usr ;make && make install
# 进入/opt目录
cd /opt
# 下载gcc-7.3.0源码
curl ftp://ftp.gnu.org/pub/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gz -O
# 解压源码
tar -xzvf ./gcc-7.3.0.tar.gz
# 进入gcc-7.3.0 目录
cd gcc-7.3.0
# configure配置编译参数
./configure --with-system-zlib --disable-multilib --enable-languages=c,c++
# make进行编译 ,j2 : 2代表使用两个线程进行编译,多线程编译可以提高编译速度,根据内存和cpu核数选择,一般选择核数个线程即可,太多意义不大
make -j2
# 编译完安装
make install
# 备份原libstdc++.so.6
mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.back
cp /usr/local/lib64/libstdc++.so.6.0.24 /usr/lib64/
# 软连接新版本libstdc++.so.6.0.24
ln -s /usr/lib64/libstdc++.so.6.0.24 /usr/lib64/libstdc++.so.6
# 查看g++ 版本
g++ -v
[root@izt4nd4l29eb06yz533quoz bin]# g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/7.3.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ./configure --with-system-zlib --disable-multilib --enable-languages=c,c++
Thread model: posix
gcc version 7.3.0 (GCC)
# 查看gcc 版本
[root@izt4nd4l29eb06yz533quoz bin]# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/7.3.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ./configure --with-system-zlib --disable-multilib --enable-languages=c,c++
Thread model: posix
gcc version 7.3.0 (GCC)
c++17 特性测试
test.cpp
#include <iomanip>
#include <iostream>
#include <string>
#include <type_traits>
#include <variant>
#include <vector>
template<class T> struct always_false : std::false_type {};
using var_t = std::variant<int, long, double, std::string>;
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
int main() {
std::vector<var_t> vec = {10, 15l, 1.5, "hello"};
for(auto&& v: vec) {
// void 观览器,仅为其副效应调用
std::visit([](auto&& arg){std::cout << arg;}, v);
// 返回值的观览器,返回另一 variant 的常见模式
var_t w = std::visit([](auto&& arg) -> var_t {return arg + arg;}, v);
std::cout << ". After doubling, variant holds ";
// 类型匹配观览器:亦能为带 4 个重载的 operator() 的类
std::visit([](auto&& arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, int>)
std::cout << "int with value " << arg << '\n';
else if constexpr (std::is_same_v<T, long>)
std::cout << "long with value " << arg << '\n';
else if constexpr (std::is_same_v<T, double>)
std::cout << "double with value " << arg << '\n';
else if constexpr (std::is_same_v<T, std::string>)
std::cout << "std::string with value " << std::quoted(arg) << '\n';
else
static_assert(always_false<T>::value, "non-exhaustive visitor!");
}, w);
}
for (auto&& v: vec) {
std::visit(overloaded {
[](auto arg) { std::cout << arg << ' '; },
[](double arg) { std::cout << std::fixed << arg << ' '; },
[](const std::string& arg) { std::cout << std::quoted(arg) << ' '; },
}, v);
}
}
# 编译命令
g++ ./test.cpp -o test -std=c++17
# 执行程序
./test
# 输出结果
10. After doubling, variant holds int with value 20
15. After doubling, variant holds long with value 30
1.5. After doubling, variant holds double with value 3
hello. After doubling, variant holds std::string with value "hellohello"
10 15 1.500000 "hello"
没有评论
博主关闭了评论...