一、概述

        Boost是免费的可移植的C++开源库,这里版本选择1.76.0。

1、Windows平台

参考:Windows平台构建流程
解压boost_1_76_0.zip,进入目录boost_1_76_0,执行命令:

bootstrap.bat

然后执行:

b2.exe install --prefix=D:\boost-1.76.0-windows-x86_64-msvc

boost库将被安装到目录D:\boost-1.76.0-windows-x86_64-msvc下。

2、Linux平台

参考:类Unix平台(例如:Linux、MacOS)构建流程
解压boost_1_76_0.tar.gz,进入目录boost_1_76_0,执行命令:

(1)常规编译

sudo ./bootstrap.sh --prefix=/opt/boost-1.76.0-ubuntu-x64

然后执行(注意: gcc5.4默认是不开启c++11的,某些依赖c++11特性的代码不会生效,部分lib依赖c++11的功能,如果不支持此特性,就不会被编译。比如fiber在没有开启c++11支持下就不会被编译。所以需要打开c++11的支持,gcc5.4下只打开-std=c++11是不能编译fiber的,更高版本的gcc使用-std=c++14 或者-std=c++17也是可以成功):

sudo ./b2 install cxxflags="-std=c++14"

boost库将被安装到目录/opt/boost-1.76.0-ubuntu-x64下,设置环境变量,编辑/etc/profile文件,末尾添加:

export BOOST_ROOT=/opt/boost-1.76.0-ubuntu-x64 # 需要命名为BOOST_ROOT, 否则CMake时会找不到Boost模块
# 运行依赖
export LD_LIBRARY_PATH=$BOOST_ROOT/lib:$LD_LIBRARY_PATH
# 开发依赖
export CPATH=$BOOST_ROOT/include:$CPATH
export LIBRARY_PATH=$BOOST_ROOT/lib:$LIBRARY_PATH

(2)交叉编译

sudo ./bootstrap.sh --prefix=/opt/boost-1.76.0-raspberrypi-armv7l

修改boost_1_76_0目录下的project-config.jam文件,把
using gcc ;
替换为
using gcc : arm : arm-linux-gnueabihf-g++ ;
注意保留空格,如:
在这里插入图片描述

在这里插入图片描述

然后执行(注意: 根据gcc的版本选择cxxflag选项的值)

sudo ./b2 toolset=gcc-arm architecture=arm address-model=32 binary-format=elf instruction-set=armv7-a abi=aapcs cxxflags="-std=c++14" install

选项说明:

  • toolset=gcc-arm
    • 含义:指定使用的工具集(编译器)。
    • 作用:告诉 b2 使用 gcc-arm 工具集进行编译。这需要在 project-config.jam 文件中定义对应的工具集。例如:
using gcc : arm : arm-linux-gnueabihf-g++ ;

这里 gcc : arm 表示工具集类型为 gcc,标识符为 arm。

  • architecture=arm
    • 含义:指定目标架构。
    • 作用:告诉 b2 生成的代码适用于 ARM 架构。这对于确保生成的代码与目标硬件兼容非常重要。
  • address-model=32
    • 含义:指定目标地址模型。
    • 作用:告诉 b2 生成 32 位代码。这对于 ARMv7 架构的树莓派是必要的,因为树莓派 3 和树莓派 4 默认使用 32 位模式。
  • binary-format=elf
    • 含义:指定目标二进制格式。
    • 作用:告诉 b2 生成的可执行文件和库文件使用 ELF(Executable and Linkable Format)格式。这是 Linux 系统中常用的二进制格式。
  • instruction-set=armv7-a
    • 含义:指定目标指令集。
    • 作用:告诉 b2 生成的代码使用 ARMv7-A 指令集。ARMv7-A 是 ARMv7 架构的高级指令集,适用于树莓派 2、3 和 4。
  • abi=aapcs
    • 含义:指定目标 ABI(Application Binary Interface)。
    • 作用:告诉 b2 使用 ARM 的 AAPCS(ARM Architecture Procedure Call Standard)ABI。这是 ARM 架构的标准调用约定,适用于大多数 ARM Linux 系统。

二、构建方式

        如何构建Boost库呢?大部分情况下,并不需要构建,因为大多数的Boost库都仅使用头文件(.hpp):它们完全由包含模板和内联函数的头文件组成,不需要单独编译库二进制文件,也不需要在链接时进行特殊处理。
        只有少部分库才需要单独构建:

  • Boost.Chrono
  • Boost.Context
  • Boost.Filesystem
  • Boost.GraphParallel
  • Boost.IOStreams
  • Boost.Locale
  • Boost.Log ()
  • Boost.MPI
  • Boost.ProgramOptions
  • Boost.Python
  • Boost.Regex
  • Boost.Serialization
  • Boost.Thread
  • Boost.Timer
  • Boost.Wave

        少部分库有可选的单独编译的二进制文件:

  • Boost.Exception
  • Boost.Graph
  • Boost.Math
  • Boost.Random
  • Boost.System
  • Boost.Test

三、链接库

        Visual Studio需要设置工程属性:

  • 配置属性 | C/C++ | 预编译头 | 预编译头”为“不使用预编译头
  • 配置属性 | C/C++ | 常规 | 附加包含目录”添加Boost库头文件路径,例如:E:\workspace\boost_1_76_0

        大部分的Windows编译器和链接器有所谓的Auto-Linking support
        Boost库头文件中有特殊的代码,可以检测编译器选项,并使用这些信息把正确的库名称编码到目标文件中。链接器将从我们所指定的目录选择具有该名称的库文件。
        How boost auto-linking makes choice
        如果不想自动连接,则可以使用BOOST_ALL_NO_LIB宏来取消自动连接,然后自行指定依赖库文件。

四、官方文档

        1.76.0库官方文档说明

五、开发过程注意项

1、编译出错"fatal error C1189: #error : WinSock.h has already been included"

1>C:\Program Files\boost-1.76.0-windows-x86_64-msvc\include\boost-1_76\boost/asio/detail/socket_types.hpp(24,1): fatal error C1189: #error:  WinSock.h has already been included
  • 方法1:调整boost/asio.hppWindows.h的包含顺序,把Windows.h放到boost/asio.hpp后面包含。
  • 方法2:在Windows.h包含前增加宏定义WIN32_LEAN_AND_MEAN
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐