1.使用b2编译Boost库

首先下载boost源代码

Boost 1.90.0

下载好之后进入到目录。运行bootstrap.bat

运行时后面可以接已经存在于本地的编译器,默认是msvc,可以在 bootstarp.bat 上看到

也可以指定自己的编译器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SET TOOLSET=msvc

IF "%1"=="gcc" SET TOOLSET=gcc
IF "%1"=="clang" SET TOOLSET=clang
IF "%1"=="borland" SET TOOLSET=embarcadero
IF "%1"=="vc71" SET TOOLSET=msvc : 7.1
IF "%1"=="vc8" SET TOOLSET=msvc : 8.0
IF "%1"=="vc9" SET TOOLSET=msvc : 9.0
IF "%1"=="vc10" SET TOOLSET=msvc : 10.0
IF "%1"=="vc11" SET TOOLSET=msvc : 11.0
IF "%1"=="vc12" SET TOOLSET=msvc : 12.0
IF "%1"=="vc14" SET TOOLSET=msvc : 14.0
IF "%1"=="vc141" SET TOOLSET=msvc : 14.1
IF "%1"=="vc142" SET TOOLSET=msvc : 14.2
IF "%1"=="vc143" SET TOOLSET=msvc : 14.3

执行后得到

b2.exe(新版构建工具,现在一般只有这个)

project-config.jam(项目配置文件)

如果需要使用msvc 编译需要下载visual studio 工具。不过官网页提供了现成的msvc版本的boost库,安装即可使用

如果使用gcc 需要下载msys + mingw工具。

以下是编译相关参数

参数 可选值 作用说明
--prefix=<path> 路径 安装目录前缀,决定 include / lib / share 生成在哪
--build-dir=<path> build 路径 中间构建目录(obj、临时文件)
--with-<lib> context 只编译指定库
--without-<lib> python 排除某些库
install 固定命令 编译并安装
stage 固定命令 只编译,不安装
参数 可选值 说明
variant debug / release 编译类型
debug-symbols on / off 是否生成调试符号
参数 可选值 说明
link static / shared 生成静态库或动态库
runtime-link static / shared C++ 运行库链接方式
threading single / multi 单线程 / 多线程版本
参数 可选值 说明
toolset msvc / gcc / clang 编译器
architecture x86 / x86_64 CPU 架构
address-model 32 / 64 32 / 64 位
cxxstd 11 / 14 / 17 / 20 C++ 标准
define= 预定义宏
参数 作用
install 触发安装(才会有 include / lib)
--prefix= include / lib / share 的根目录
--includedir= 单独指定头文件目录
--libdir= 单独指定库目录
1
.\b2.exe -j%NUMBER_OF_PROCESSORS% toolset=gcc target-os=windows address-model=64 variant=debug,release link=shared runtime-link=shared threading=multi  --with-context  --layout=versioned  --build-dir=D:\3rdparty\context\build  --prefix=D:\3rdparty\context install

以上编译出动态库指令。

只需要修改 --with- 修改为自己需要的库。要注意修改--build-dirprefix两个文件夹

需要静态库时只需要修改link = static

一些具体参数可以去官网查看

在 Boost 中,例如boost::stacktrace 等 并不是一个单一实现的库,而是一个统一接口
根据不同的平台、编译器和符号解析方式,Boost 提供了多种后端实现(backend)
这些后端在 CMake 中体现为不同的 imported targets,例如

  • Boost::stacktrace_windbg
  • Boost::stacktrace_windbg_cached
  • Boost::stacktrace_backtrace
  • Boost::stacktrace_addr2line
  • Boost::stacktrace_basic
  • Boost::stacktrace_noop

我们可以根据需要,编译出适合程序的库。具体有什么可以去Boost Libraries查看。不过b2编译器会根据平台编译出最适合的实现。

例如我们在window直接执行如下命令

1
.\b2.exe -j%NUMBER_OF_PROCESSORS% toolset=gcc target-os=windows address-model=64 variant=debug,release link=shared runtime-link=shared threading=multi  --with-context  --layout=versioned  --build-dir=D:\3rdparty\context\build  --prefix=D:\3rdparty\context install

只能得到stacktrace_form_exceptionstacktrace_noopstacktrace_windbg_cachedstacktrace_windbg四个实现。

1
.\b2.exe -j%NUMBER_OF_PROCESSORS% toolset=gcc target-os=windows address-model=64 variant=debug,release link=shared runtime-link=shared threading=multi --with-stacktrace --layout=versioned --build-dir=D:\3rdparty\stacktrace\build --prefix=D:\3rdparty\stacktrace boost.stacktrace.addr2line=on boost.stacktrace.windbg=off install

执行如上命令会编译出stacktrace.addr2line(虽然大概率编译失败)。

2.使用cmake 编译 boost库(更现代,更简单)

推荐使用vscode + cmake 来编译。

cmake 版本下载链接 boost1.90 github下载

首先确保自己电脑上安装了cmake,我使用的是cmake 3.31.6版本。理论上3.8+版本都可以。

Windows下CMake 安装攻略(详细图文教程)_cmake安装windows-CSDN博客

github cmake 3.31.6版本下载链接

配置好了cmake,并且将代码下载下来之后,解压缩代码。

创建build文件夹并且进入build文件夹

1
mkdir build; cd build

接下来执行

1
cmake -S . -B build -G "MinGW Makefiles" -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=D:/boost-shared-install -DCMAKE_BUILD_TYPE=RelWithDebInfo

这里的 -G 用来选择生成器。MinGW Makefiles 选用的是MinGW,Visual Studio 17 2022就使用的msvc

要注意的是MinGW Makefiles是单配置生成器,只能生成debugrelease或其他的一种,而Visual Studio 17 2022是多配置生成器,可以一口气生成完整的debug + release版本的boost库

DBUILD_SHARED_LIBS: 是否生成动态库

DCMAKE_INSTALL_PREFIX: 安装路径

DCMAKE_BUILD_TYPE: 构建类型,包括Debug、Release、MinSizeRel、RelWithDebInfo

然后执行如下命令,得到编译完成的产物

1
cmake --build build -j

执行如下命令,就会安装完整的boost库, —prefix 指定安装目录(也可以用前面配置过的安装路径。如果没有配置过使用这个)

1
cmake --install build --prefix D:/myinstall
1
2
3
4
cmake -S . -B build -G "MinGW Makefiles" -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=D:/boost-shared-install -DCMAKE_BUILD_TYPE=RelWithDebInfo

cmake --build build -j
cmake --install build

下面是两种编译方式的一个区别:

使用b2 编译难度会略大一些,因为编译参数比较多,但是可以生成指定的boost库。

使用cmake编译难度小很多,体验下来速度也相应的快很多,但是使用MinGW Makefile编译一次只能生成debug 或 release版本(可以生成RelWithDebInfo 版本,兼顾了debug的调试以及release的优化,但是体积较大,可能需要修改Cmake代码)。

生成 RelWithDebInfo 版本报错FAILED: stage/bin/libboost_cobalt_io.dll stage/lib/libboost_cobalt_io.dll.a解决:

在 libs/cobalt/CMakeLists.txt 添加如下

=
boost1

1
target_link_libraries(boost_cobalt_io PRIVATE bcrypt mswsock )

在执行cmake 时,编译选项添加如下

1
-DBOOST_STACKTRACE_ENABLE_FROM_EXCEPTION:BOOL=OFF