原文链接
前言
对于C++
的开发而言Boost
是常用的工具包,虽然说:
Most Boost libraries are header-only: they consist entirely of header files containing templates and inline functions, and require no separately-compiled library binaries or special treatment when linking
但是还是有很多常用库是依赖的构建的,其中官网的文档主要针对的是VS
系列的构建,使用MinGW
构建还是有一些坑的,这里我们将从源码使用MinGW
进行构建
构建
源码下载
官网地址,这里我们以写作的时候最新版本1.87.0为例,下载源码后解压,然后将命令行位置进入解压后的文件夹boost_1_87_0
下
B2构建
Boost.Build
是其提供的个基于文本的系统,用于开发、测试和安装软件。我们这里首先需要构建安装B2
再利用它构建Boost
库,进入tools/build
目录,运行bootstrap.bat mingw
此时B2
构建完成
如果遇到res.rc:1: fatal error: when writing output to : Invalid argument
,打开执行的bootstrap.bat
,我们观察到实际执行的的脚本为src/engine/build.bat
,该脚本最后执行%B2_CXX% %CXXFLAGS% %B2_CXXFLAGS% %B2_SOURCES% %B2_CXX_LINK%
报错,而环境变量可以阅读出是从同文件夹下的config_toolset.bat
定义,打开该文件夹在:Config_MINGW
配置中,执行到:Embed_Minafest_Via_Windres
,找到实际执行错误代码为:"B2_CXX="%%i" --input res.rc --output res.o && %B2_CXX% -Wl,res.o"
,%%i
为windres
简单介绍一下windres
,这个是Windows
的资源编译器,可以将rc
类的资源文件编程成二进制.o
文件,一般是处理清单文件即manifest
,或者版本信息,或者一些UI
文件,编译成.o
的目标文件后C
程序就可以直接链接了。如果使用的资源文件过大,或者对于某些版本的MinGW
兼容性处理有问题,遇到内存分配问题,需要加--use-temp-file
这里我们在config_toolset.bat
中,修改config_toolset.bat
将 set "B2_CXX="%%i" --input res.rc --output res.o && %B2_CXX% -Wl,res.o"
改成 set "B2_CXX="%%i" --input res.rc --output res.o --use-temp-file && %B2_CXX% -Wl,res.o"
即可
构建Boost
B2
构建完成后,将该文件夹添加到环境变量,即可以在命令行直接调用b2 -v
,即b2
构建顺利,此时回到boost_1_87_0
文件夹下,执行b2 install --toolset=gcc --prefix="_install"
即可。如果需要只构建指定模块,则使用b2 --toolset=gcc --show-libraries
查看所需文件名,再利用b2 install --with-json --toolset=gcc --prefix="_install"
构建
链接Boost
我们这里以CMakeLists.txt
为例,首先给出安装位置set(BOOST_ROOT /to/your/path/boost_1_87_0/_install)
,获取引用包模块find_package(Boost REQUIRED COMPONENTS json)
,最后将指定模块链接上即可target_link_libraries(YourProject Boost::json)