如何解决Boost Log 1.72在MinGW下的链接错误及构建问题
1. 修复Windows MinGW环境下的Boost Log链接错误
你碰到的未定义引用错误,核心原因是构建Boost库时没显式包含Log模块,而且链接阶段也没指定Log依赖的库文件。
之前的构建命令大概率只默认编译了部分常用模块,而Boost Log属于需要手动指定编译的组件。你需要重新构建Boost,确保命令里加上--with-log参数(你的更新方案里已经覆盖到了,这里再强调下必要性)。
重新构建完成后,在应用的链接步骤里必须显式添加Log和其依赖的线程库静态文件:
..\Boost_1_72_0\stage\lib\libboost_log-mgw81-mt-x64-1_72.a ..\Boost_1_72_0\stage\lib\libboost_thread-mgw81-mt-x64-1_72.a
如果习惯用编译器参数的方式,也可以通过-L指定库路径,再用-lboost_log-mgw81-mt-x64-1_72 -lboost_thread-mgw81-mt-x64-1_72来链接,效果完全一致。
2. 构建并静态链接Boost库
要实现静态链接,核心是在构建Boost时指定--link=static参数,同时搭配threading=multi(Boost Log依赖多线程支持)、variant=debug(调试版本,发布版替换为variant=release)。
完整的构建命令可以参考你提供的(建议只编译实际用到的模块,不用全量编译,节省时间和磁盘空间):
call bootstrap.bat mingw call .\b2 toolset=gcc target-os=windows --address-model=64 --link=static --variant=debug threading=multi --with-log --with-thread [其他你需要的模块,比如asio]
静态链接时,确保项目的编译配置包含:
- Boost头文件路径:
-I../Boost_1_72_0 - Boost静态库路径:
-L../Boost_1_72_0/stage/lib - 需要链接的库名:比如
-lboost_log-mgw81-mt-x64-1_72 -lboost_thread-mgw81-mt-x64-1_72 -lboost_system-mgw81-mt-x64-1_72(根据实际依赖调整)
这样编译出来的可执行文件会把Boost的代码直接集成进去,不需要额外携带Boost库文件。
3. 同时构建MinGW和树莓派GCC版本的Boost库并存
主机是Windows的情况下,要让两个平台的Boost库共存,核心是给不同平台的构建指定独立的输出目录,避免文件覆盖:
针对MinGW(Windows)构建:
构建时可以用--prefix参数指定安装目录,比如:
call bootstrap.bat mingw call .\b2 toolset=gcc target-os=windows --address-model=64 --link=static --variant=debug,release threading=multi --with-log --with-thread --prefix=./install/mingw64 install
这样MinGW版本的头文件和库会被安装到./install/mingw64目录下。
针对树莓派Linux构建:
如果在Windows上交叉编译树莓派的Boost库,先配置好交叉编译工具链(比如arm-linux-gnueabihf-gcc),再执行以下步骤:
bootstrap.bat gcc echo using gcc : arm : arm-linux-gnueabihf-gcc ; > tools/build/src/user-config.jam b2 toolset=gcc-arm target-os=linux --address-model=32 --link=static --variant=debug,release threading=multi --with-log --with-thread --prefix=./install/raspi install
如果直接在树莓派上构建,就登录树莓派下载Boost源码,用类似命令编译后,把库文件拷贝回Windows的./install/raspi目录即可。
之后,项目可以根据目标平台切换Boost的路径:
- 编译Windows版本:用
-I./install/mingw64/include和-L./install/mingw64/lib - 编译树莓派版本:用
-I./install/raspi/include和-L./install/raspi/lib
这样两个版本的Boost库就能在本地并存,互不干扰。
内容的提问来源于stack exchange,提问作者AndreStony

