如何编译asio协程

协程固然方便,但是编译起来稍微费点事。我已经摸索出行之有效的办法,读者照抄即可。

一、MSVC编译器设置

语言标准:c++17
项目设置的命令行选项里加上/await

二、Xcode编译器设置

第一步设置工程语言标准为c++17

第二步选择工程文件里面的target,进入build phases,选择使用了协程的cpp文件,添加compiler flags
-fcoroutines-ts
用意是告诉编译器让其支持协程
参数说明可见:http://clang.llvm.org/cxx_status.html#ts

第三步添加预处理器BOOST_ASIO_HAS_CO_AWAIT,告诉ASIO使用协程功能

三、g++编译选项

g++版本必须是10或以上才支持coroutine,这是因为coroutine作为c++20版本加入语言特性,然后g++10是第一个支持c++20标准的编译器
另外asio版本必须是1.18以上,boost库对应1.74。这是因为从这个版本开始asio针对g++支持coroutine的特性做了调整

编译的写法如下:
g++-10 -std=c++20 -I/path/to/asio/lib -pthread -fcoroutines co_server.cpp -o HelloCoServer

-fcoroutines指明让编译器支持coroutine(见https://gcc.gnu.org/projects/cxx-status.html)
-pthread是使用std::thread需要写明的,在linux上标准库的多线程是使用pthread库作为底层实现的,理论上而言指明c++11标准就应该自动链接过去了,但是因为某些原因编译时需要显式指明。asio使用了线程库所以这里需要写出来
那个-I是使用非boost库的asio情况下要指明头文件搜索路径
另外得益于新的c++标准可以自己检查头文件等情况,所以不需要定义宏ASIO_STANDALONE和ASIO_HAS_CO_AWAIT了