如何使Boost.Asio的spawn(栈式协程)仅依赖Boost.Context?
Boost.Asio 1.80 移除 Boost.Coroutine 依赖的迁移指南
背景说明
Boost 1.80的Asio版本更新明确提到:
当目标为C++11及更高版本时,spawn()和basic_yield_context直接基于Boost.Context实现。
这意味着我们可以彻底移除对Boost.Coroutine的依赖——该库并非仅头文件形式,需要额外编译;而使用boost::asio::spawn时仅需保留Boost.Context依赖即可。
具体迁移步骤
- 清理构建配置:从项目的构建脚本(CMake、Makefile等)中删除所有与Boost.Coroutine相关的配置。比如CMake中移除
find_package(Boost REQUIRED COMPONENTS coroutine),链接阶段不再添加Boost::coroutine目标;Makefile中删掉对应的编译、链接参数。 - 检查头文件引用:移除代码中所有直接包含的Boost.Coroutine相关头文件(如
<boost/coroutine/all.hpp>)。Asio的<boost/asio/spawn.hpp>会自动处理Boost.Context的依赖,无需额外引入。 - 代码逻辑无需改动:原有的
boost::asio::spawn调用、boost::asio::basic_yield_context的使用代码完全兼容,不需要做任何修改——Asio会在C++11+环境下自动切换到Boost.Context的底层实现。 - 确认Boost.Context依赖:确保项目已正确引入Boost.Context。如果使用编译版的Boost.Context,需在构建脚本中添加对应的链接配置;若采用仅头文件模式,保证Boost头文件路径正确即可。
关键注意事项
- 必须将项目的编译标准设置为C++11或更高版本,否则Asio仍会默认使用Boost.Coroutine的实现。
- Boost.Context部分版本可能需要编译,需确认其编译产物已正确链接到项目中。
内容的提问来源于stack exchange,提问作者Emile Cormier
相关产品推荐
相关产品推荐

