Boost库学习笔记(1)—— 安装编译
一、概述 Boost是免费的可移植的C++开源库。Windows平台构建流程类Unix平台(例如:Linux、MacOS)构建流程二、构建方式 如何构建Boost库呢?大部分情况下,并不需要构建,因为大多数的Bo
文章目录
一、概述
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、编译出错"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.hpp
和Windows.h
的包含顺序,把Windows.h
放到boost/asio.hpp
后面包含。 - 方法2:在
Windows.h
包含前增加宏定义WIN32_LEAN_AND_MEAN
。
更多推荐
所有评论(0)