[c++ boost][基础篇-1]-windows下编译boost库
-
- 1.介绍
- 2.源码下载
- 3.使用MSVC编译
-
- 3.1编译示例
- 3.2 命名规则
- 3.3 默认编译
-
- 3.3.1编译paddle所需boost库`MT`版本
- 3.4 静态编译
- 4.使用gcc编译
- 5.使用arm编译
- 6.使用mingw编译
1.介绍
强大的C++库,包含了各种编程所需的工具
官网 https://www.boost.org/
2.源码下载
最近几个版本地址 https://www.boost.org/users/history/
3.使用MSVC编译
# 命令行执行
bootstrap.bat
一会儿时间后就会生成编译的所需的b2.exe
或者bjam.exe
两个都一样的
然后执行查看编译参数
b2 --help
# 下面只展示关键参数
# 可以只编译指定的库
# --with-<library> Build and install the specified <library>. If this option is used, only libraries specified using this #option will be built.
# 指定工具集
# toolset=toolset Indicate the toolset to build with.
# 编译debug或者release版本,默认都编译
# variant=debug|release Select the build variant
# 编译静态链接库或者动态链接库, 默认静态链接库
# link=static|shared Whether to build static or shared libraries
# 编译单线程版本还是多线程版本, 默认多线程
# threading=single|multi Whether to build single or multithreaded binaries
# 运行时链接方式,分静态和动态,也就是VS里的的MT/MD,后面详细介绍
# runtime-link=static|shared Whether to link to static or shared C and C++runtime.
# 指定编译32位或64位,默认都编译
# address-model=64|32
其中参数toolset
可在bootstrap.bat
中查看
# bootstrap.bat 41行开始
SET TOOLSET=msvcIF "%1"=="gcc" SET TOOLSET=gcc
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
上面列出了支持的所有工具集有gcc
和msvc
,可以看到本教程目前使用的版本boost_1_67_0
最高只支持14.1
也就是vs 2017
# VS和MSVC对应关系,在后面设置编译参数时需要用到
VS 2017 --> 14.1
VS 2015 --> 14.0
VS 2013 --> 12.0
3.1编译示例
-
1.有时候为了省时间,只编译
date_time
和filesystem
库(filesystem
依赖system
),使用vs2015,编译64位库b2 toolset=msvc-14.0 --with-date_time --with-filesystem --with-system address-model=64
得到如下库文件,带
gd
的表示debug库
stage/lib/libboost_date_time-vc140-mt-gd-x64-1_67.lib
stage/lib/libboost_date_time-vc140-mt-x64-1_67.lib
stage/lib/libboost_filesystem-vc140-mt-gd-x64-1_67.lib
stage/lib/libboost_filesystem-vc140-mt-x64-1_67.lib
stage/lib/libboost_system-vc140-mt-gd-x64-1_67.lib
stage/lib/libboost_system-vc140-mt-x64-1_67.lib
-
2.使用vs2015,只编译
date_time
库,只编译64
位release
版本b2 toolset=msvc-14.0 --with-date_time address-model=64 variant=release
得到如下文件
libboost_date_time-vc140-mt-x64-1_67.lib
>>770KB
-
3.使用vs2015,只编译
date_time
库,只编译64
位release
版本,并且选动态库版本b2 toolset=msvc-14.0 --with-date_time address-model=64 variant=release link=shared
得到如下文件,注意观察文件名前面少了
lib
boost_date_time-vc140-mt-x64-1_67.lib
>>30KB
boost_date_time-vc140-mt-x64-1_67.dll
>>60KB
-
4.使用vs2017 (注:实际使用vs2015编译,只为了演示不同vs下工具集参数如何设置),只编译
date_time
库,只编译64
位release
静态库
版本,并且选择MT
版本 MT介绍b2 toolset=msvc-14.1 --with-date_time address-model=64 variant=release link=static runtime-link=static
得到如下文件
libboost_date_time-vc140-mt-s-x64-1_67.lib
>>807KB
-
5.使用vs2017 (注:实际使用vs2015编译,只为了演示不同vs下工具集参数如何设置),只编译
date_time
库,只编译64
位release
静态库
版本,并且选择MD
版本 MD介绍b2 toolset=msvc-14.1 --with-date_time address-model=64 variant=release link=static runtime-link=shared
得到如下文件
libboost_date_time-vc140-mt-x64-1_67.lib
>>770KB
3.2 命名规则
好了,细心的小伙伴发现了,上面每次编译出来的库名称有点不太一样,现在让我们根据库大小来推断一下
- 上面
第2条
和第3条
表明默认使用link=static
参数编译,即得到静态库版本,表示程序运行时不需要依赖额外的dll文件 - 上面
第4条
和第5条
表明默认使用runtime-link=static
参数编译,即得到MT
版本
说了这么多MT
和MD
到底干嘛用的,好了官方告诉你了,
指示多线程模块是否为 DLL。
一句话,我也不太懂,但是你编译的时候所有库的都需要保持一致,要么全为MT
要么全部为MD
,不然链接的时候会出现各种匹配不上的错误。参考官网
3.3 默认编译
当然了,一般新手并不了解boost一共有多少个需要编译的库,和哪些不需要编译就可以使用的纯头文件的库,所以建议直接全部编译就行,就是有点费时。
# 默认编译 vs2017
b2 toolset=msvc-14.1
# vs2013
b2 toolset=msvc-12.0
上面的命令表示,所有参数缺省,均使用默认参数,关于默认参数上面有介绍
3.3.1编译paddle所需boost库MT
版本
没有boost的同学 可以下载 boost_1_67_0.zip 或者 所有版本 保存到lib
文件夹下然后解压,并执行
#
bootstrap.bat
# vs2015 执行
b2 toolset=msvc-14.0 --with-date_time --with-filesystem --with-system --with-regex address-model=64 variant=release link=static runtime-link=static
# vs2017 执行
b2 toolset=msvc-14.1 --with-date_time --with-filesystem --with-system --with-regex address-model=64 variant=release link=static runtime-link=static
出现如下文件表明编译成功
stage/lib/libboost_date_time-vc140-mt-s-x64-1_67.lib
stage/lib/libboost_filesystem-vc140-mt-s-x64-1_67.lib
stage/lib/libboost_regex-vc140-mt-s-x64-1_67.lib
stage/lib/libboost_system-vc140-mt-s-x64-1_67.lib
3.4 静态编译
4.使用gcc编译
未更新
./bootstrap.sh --with-toolset=gcc
./b2
./bootstrap.sh --with-libraries=date_time --with-libraries=filesystem --with-libraries=system --with-libraries=regex --with-toolset=gcc ./b2 install --prefix='/usr/local/include'
5.使用arm编译
未更新
./bootstrap.sh --with-toolset=gcc architecture=arm
./b2 architecture=arm --CXX_FLAGS=-fPIC --C_FLAGS=-fPIC
6.使用mingw编译
未更新
cd */engine
build.bat gcccd boost_1_67_0
bjam "toolset=gcc" link=static runtime-link=static threading=multi --build-type=complete release