【C++20】GCC10.1构建经验

#镜像

http://www.gnu.org/prep/ftp.html    GNU镜像列表

https://mirrors.ustc.edu.cn/gnu/      (国内)清华大学GNU镜像

#下载

#下载地址
#gcc 10.1
路径1(推荐):https://mirrors.ustc.edu.cn/gnu/gcc/gcc-10.1.0/gcc-10.1.0.tar.gz
路径2:https://ftp.gnu.org/gnu/gcc/gcc-10.1.0/gcc-10.1.0.tar.gz

解压后,尝试生成Makefile 

提示需要安装:GMP、MPFR、MPC依赖库

#工具

apt install vim
apt install wget
apt install gcc
apt install gcc-c++
#基础编译软件 
apt install m4
apt install texinfo
#编译gcc时候用到的
apt install zip

#依赖库 

#automake 1.15
#gmp-4.3.2
#mpfr-3.1.4
#mpc-1.0.3

### 下载地址
## automake-1.15
(Ubuntu 18.04自带,无需下载安装)
路径1(推荐):$ wget https://mirrors.ustc.edu.cn/gnu/automake/automake-1.5.tar.gz
路径2:$ wget ftp://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz

## gmp
路径1(推荐):$ wget https://mirrors.ustc.edu.cn/gnu/gmp/gmp-4.3.2.tar.bz2
路径2:$ wget ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2

## mpfr
路径1(推荐):$ wget https://mirrors.ustc.edu.cn/gnu/mpfr/mpfr-3.1.4.tar.bz2
路径2:$ wget https://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2

## mpc-1.0.3
路径1(推荐):$ wget https://mirrors.ustc.edu.cn/gnu/mpc/mpc-1.0.3.tar.gz
路径2:$ wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz


## 挨个解压gmp、mpfr、mpc包


## install automake
(Ubuntu 18.04自带,无需构建安装,跳过此步)
$ cd automake-1.15
$ ./configure --prefix=/usr/local/automake-1.15
$ make
$ make install 
#rpm -e --nodeps automake
#如果有卸载老版本,没有删除/usr/bin/automake
$ rm -rf automake
$ ln -s /usr/local/automake-1.15/bin/automake /usr/bin/automake
#edit export path
$ echo export PATH=$PATH:/usr/local/automake-1.15/bin >> /etc/profile


## install gmp
$ cd ../gmp-4.3.2
$ ./configure  --prefix=/usr/local/gmp-4.3.2/


## install mpfr
$ cd  ../mpfr-3.1.4
$ ./configure --prefix=/usr/local/mpfr-3.1.4/ --with-gmp=/usr/local/gmp-4.3.2/
$ make 
$ make install 
 

## install mpc
$ cd ../mpc-1.0.3
$ ./configure --prefix=/usr/local/mpc-1.0.3 --with-gmp=/usr/local/gmp-4.3.2/ --with-mpfr=/usr/local/mpfr-3.1.4/
$ make
$ make install


## gmp、mpfr、mpc库路径加入系统库变量中
$ echo export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpc-1.0.3/lib:/usr/local/gmp-4.3.2/lib:/usr/local/mpfr-3.1.4/lib >> ~/.bashrc
$ source ~/.bashrc

或者

(如果没有写入权限,使用sudo vim /etc/profile直接编辑)
$ echo export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpc-1.0.3/lib:/usr/local/gmp-4.3.2/lib:/usr/local/mpfr-3.1.4/lib >> /etc/profile
$ source /etc/profile

# 构建

$ ll
-rw-rw-r--  1 duo duo 131174790 6月  19 11:29 gcc-10.1.0.tar.gz

# 解压
$ tar -xzvf gcc-10.1.0.tar.gz

# 进入
$ cd gcc-10.1.0

# 生成Makefile
$ ./configure --prefix=/usr/local/gcc-10.1.0/ --enable-threads=posix --disable-checking --enable--long-long --disable-multilib --enable-languages=c,c++ --with-gmp=/usr/local/gmp-4.3.2/ --with-mpfr=/usr/local/mpfr-3.1.4/ --with-mpc=/usr/local/mpc-1.0.3/

# 构建
$ make
(如果提示找不到"mpfr.so.4"等mpfr、mpc、gmp动态链接库文件,是因为“#依赖库”步骤中的这三个库文件的路径没有添加到“~/.bashrc”或者“/etc/profile”文件中)

大概需要1个小时 

#安装

$ sudo make install

安装到了"/usr/local/gcc-10.1.0"下,而且要保证gmp、mpc、mpfr这三个软件库不能删除!

# 创建软连接,方便使用gcc10,g++10命令

## add to /usr/bin

$ ln -s /usr/local/gcc-10.1.0/bin/gcc /usr/bin/gcc10
$ ln -s /usr/local/gcc-10.1.0/bin/g++ /usr/bin/g++10

## 键入gcc10 --version 查看版本
$ gcc10 -v
$ g++10 -v

# 测试协程

$ g++10 -o out co_vs_callback.cpp -fcoroutines -lpthread

/*
 * co_vs_callback.cpp
 *
 *  Created on: Mar 13, 2019
 *      Author: frank
 */
#include <iostream>
#include <thread>
//#include <experimental/coroutine>
#include <coroutine>
#include <chrono>
#include <functional>

// clang++ -std=c++2a -fcoroutines-ts -lstdc++ co_vs_callback.cpp

using call_back = std::function<void(int)>;
void Add100ByCallback(int init, call_back f) // 异步调用
{
	std::thread t([init, f]() {
		std::this_thread::sleep_for(std::chrono::seconds(5));
		f(init + 100);
	});
	t.detach();
}

struct Add100AWaitable
{
	Add100AWaitable(int init):init_(init) {}
	bool await_ready() const { return false; }
	int await_resume() { return result_; }
	void await_suspend(std::coroutine_handle<> handle)
	{
		auto f = [handle, this](int value) mutable {
			result_ = value;
			handle.resume();
		};
		Add100ByCallback(init_, f); // 调用原来的异步调用
	}
	int init_;
	int result_;
};

struct Task
{
	struct promise_type {
		auto get_return_object() { return Task{}; }
		auto initial_suspend() { return std::suspend_never{}; }
		auto final_suspend() { return std::suspend_never{}; }
		void unhandled_exception() { std::terminate(); }
		void return_void() {}
	};
};

Task Add100ByCoroutine(int init, call_back f)
{
	int ret = co_await Add100AWaitable(init);
	ret = co_await Add100AWaitable(ret);
	ret = co_await Add100AWaitable(ret);
	f(ret);
}

int main()
{
	Add100ByCallback(5, [](int value){ std::cout<<"get result: "<<value<<"\n"; });
	Add100ByCoroutine(10, [](int value){ std::cout<<"get result from coroutine1: "<<value<<"\n"; });
	Add100ByCoroutine(20, [](int value){ std::cout<<"get result from coroutine2: "<<value<<"\n"; });
	Add100ByCoroutine(30, [](int value){ std::cout<<"get result from coroutine3: "<<value<<"\n"; });
	Add100ByCoroutine(40, [](int value){ std::cout<<"get result from coroutine4: "<<value<<"\n"; });
	getchar();
}

参考:

https://blog.csdn.net/whq12789/article/details/106381601   GCC10.1 构建方法

https://zhuanlan.zhihu.com/p/59178345  测试协程代码

猜你喜欢

转载自blog.csdn.net/qq2399431200/article/details/106853423