我以编译安装 boost_1_73_0 版本为例:
首先安装VS2017(其他版本也可以),然后下载boost库的源码安装包:
boost下载地址:Boost Version History
1.选择一个需要的版本,这里我选择的是1.73.0版本
2.我们是在Windows环境编译安装可以选择这个zip压缩包
3.下载压缩包后,解压出如下文件,路径不限:
(我解压到E盘的boost_1_73_0文件夹中)
4.打开VS2017的命令行窗口(最好是以管理员身份打开)
5.命令行中切换到你刚刚解压出来的文件夹中,然后执行bootstrap.bat文件,此时会生成b2.exe文件
(我上面是解压到“E:\boost_1_73_0”路径中的)
6.命令行中执行上一步生成的b2.exe文件,传入安装目标路径(此过程很漫长,可能要十几分钟)
(例如我想安装在 “C:\boost_1_73_0” 路径中可以这样输入)
注意:此时同时生成的是X86和X64架构,32位和64位的静态库不是动态库。
如有特殊生成需要还能附加以下参数控制编译安装结果:
--toolset=msvc 编译器类别,可以是gcc,或者是msvc
--target-os=Windows 目标操作系统,可以是Windows,Linux
--variant=release 生成类型,可以是 debug(-gd-)或者release (-)
--threadapi=win32 线程API的实现,可以是win32或者pthread,在windows上编译就用win32
--link=static 链接库类型,可以是静态的static,也可以是shared,对应windows上的库就是.lib或者是dll
--runtime-link=static 动态还是静态链接C/C++运行时库。同样有shared (-)和static (-s-)两种方式,这样runtime-link和link可以产生4种组合方式,可以根据需要选择编译.
一位在微软做过编译器开发的大牛是这样解释的:
假设一个库A依赖于库B,我们自己的程序client依赖于库A,即:
那么,link指的是client->A,runtime-link指的是A -> B
配置 | 链接过程 | 运行时需要的文件 |
link=static runtime-link=static | client通过A.a (A.lib)静态包含A; A通过B.a (B.lib)静态包含B; 不关 .so .dll的事 | client |
link=static runtime-link=shared | client通过A.a (A.lib)静态包含A; 在运行时,client要动态调用B.so (B.dll) | client B.so (B.dll) |
link=shared runtime-link=shared | client会包含A.a (A.lib); A会包含 B.a (B.lib); 但都只保存动态库的真正实现的stub,运行时通过stub去动态加载 A.so (A.dll), B.so (B.dll) 中的实现 | client A.so (A.dll) B.so (B.dll) |
link=shared runtime-link=static | client会包含A.a (A.lib),但只包含真正实现的stub; A通过B.a (B.lib)静态包含B; 运行时,client会动态调用A.so (A.dll) | client A.so (A.dll) |
--prefix=DIR 安装路径
--user-config= 用户自定义配置文件,在cross compile的时候可以用来配置编译工具链
--address-model=32 生成32位还是64位库文件
--architecture=x86 cpu架构,一般为x86或x64,嵌入式平台为arm
编译安装64位的Release版的静态链接库可以执行下面的指令:(-mt-s-)
.\b2.exe variant=release threading=multi threadapi=win32 link=static runtime-link=static --prefix=E:\boost_1_77_0 address-model=64 architecture=x86 install -j8
-j8参数代表8线程同时编译,可以提高编译安装的速度。
7.编译安装boost库完成,在我输入的安装目标路径中会产生include和lib两个文件夹
<include> 包含文件
<lib> 静态库文件