Boost库学习笔记(1)—— 安装编译

本文围绕Boost 1.76.0 C++开源库展开,介绍其在Windows和Linux平台的构建流程,包含常规编译与交叉编译。还说明了构建方式,指出多数库仅用头文件,少部分需单独构建。提及链接库设置及官方文档,最后给出编译出错的解决方法。

一、概述

        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 threading=multi link=static,shared variant=release cxxflags="-std=c++14" install

选项说明:

  • threading:是否支持多线程,single - 单线程,multi - 多线程;
  • link:是否静态或动态库,static - 静态库,shared - 动态库,static,shared - 同时生成静态库和动态库;
  • variant:是否调试或发布版本,debug - 调试版本,release - 发布版本;

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 threading=multi link=static,shared variant=release 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
    • 含义:指定目标 CPU 架构。
    • 作用:明确编译产物的目标架构是 ARM。这对于确保生成的代码与目标硬件兼容非常重要。
  • address-model=32
    • 含义:指定目标系统的地址宽度(32 位 / 64 位)
    • 作用:32 则是 32 位 ARM 库(armhf/armel),64 表示编译 64 位库(对应 ARM64 架构)。这对于 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
    • 含义:指定目标平台的应用二进制接口(Application Binary Interface)。
    • 作用:aapcs 是 ARM 架构的标准 ABI(ARM Architecture Procedure Call Standard),定义了函数调用规则、寄存器使用、数据对齐等二进制层面的规范,确保编译出的库能在 ARM 系统上与其他程序正确链接 / 运行(ARM64 通常默认 aapcs64,此处显式指定 aapcs 兼容常见交叉编译场景)。

二、构建方式

        如何构建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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值