关于Boost.Asio中BOOST_ASIO_SEPARATE_COMPILATION的使用时机问询
BOOST_ASIO_SEPARATE_COMPILATION 宏的适用场景说明
一、先明确“单独编译源码”的含义
这里的“单独编译源码”指的是将Boost.Asio原本内嵌在头文件中的实现代码,单独提取出来编译为独立的静态库(如.a/.lib)或共享库(如.so/.dll)——不管这个库是你自己编译的,还是第三方提供的预编译归档文件,核心目的都是把Asio的实现从头文件中剥离,避免每个包含Asio头的源文件重复编译相同的代码。
二、针对你的项目场景分析
你的项目是多个自研静态库均包含Boost.Asio头文件,最终链接到同一个可执行文件:
- 如果没有单独编译Asio为独立库,只是让每个自研静态库的源文件各自编译Asio头中的实现代码,那么绝对不能添加
BOOST_ASIO_SEPARATE_COMPILATION宏——此时这个宏会告诉编译器“去外部库找Asio实现”,但你并没有提供对应的库,会直接导致链接阶段出现未定义符号错误。 - 如果打算优化编译效率和可执行文件体积,想要改为单独编译Asio为独立库,那需要分两步操作:
- 编译Asio独立库时,添加
add_compile_definition(BOOST_ASIO_SEPARATE_COMPILATION),让Asio把实现代码导出到这个库中; - 你的所有自研静态库(
my_lib_using_boost_1、my_lib_using_boost_2)和最终的可执行文件app,编译时都要添加这个宏,同时链接你编译好的Asio库。
- 编译Asio独立库时,添加
三、总结适用时机
BOOST_ASIO_SEPARATE_COMPILATION宏仅在以下场景启用:
- 你需要将Boost.Asio的实现代码单独编译为独立的静态/共享库(自研编译或第三方预编译均可);
- 所有使用Asio的项目模块(库、可执行文件),都要同步定义这个宏,并且链接该独立Asio库。
如果还是采用Boost.Asio默认的头文件库模式(每个源文件自行编译Asio头中的实现),则完全不需要启用该宏。
内容的提问来源于stack exchange,提问作者SupAl
相关产品推荐
相关产品推荐

