进入Boost官网,点击Boost的最新版本,进入选择下载页面,若使用Windows操作系统,下载Boost源码的7z压缩包。
Boost官网:https://www.boost.org
Boost源码压缩包下载之后,解压至指定位置。我把Boost源码解压至E:\Download\Boost,而Boost的根目录为E:\Download\Boost\boost_1_68_0。
Visual Studio 2017更加注重跨平台性,安装文件较多,其中VC有三个版本,分别是arm、HostX64、HostX86,此处使用HostX64的编译器cl.exe编译Boost库,安装VS时,默认cl.exe的路径并未添加至环境变量,需要自行配置。
以管理员身份打开命令提示符窗口,在窗口中输入”cl”并按Enter键回车,若窗口展现如下图所示,说明cl.exe的路径已经添加至环境变量中。
以管理员身份打开命令提示符窗口的方法见文章——Windows以管理员身份运行命令提示符
Windows菜单的PowerShell改回命令提示符的操作方法见文章——Windows菜单的PowerShell改回命令提示符
如果给予提示 ‘cl’ 不是内部或外部命令,也不是可运行的程序或批处理文件。
说明cl.exe的路径未添加至环境变量中,需要手动配置。右击桌面计算机或者我的电脑,弹出右键菜单,选择属性,出现系统窗口,点击高级系统设置,弹出系统属性窗口,点开高级选项卡,点击环境变量按钮,弹出环境变量窗口,在系统变量表中寻找并双击Path,对其值进行编辑,在值最后添加编译器cl.exe的路径,各路径之间以分号隔开。
对Path变量值进行长文本形式的编辑,且原来的值保持不变,否则会丢失系统环境路径。
我的编译器cl.exe位于E:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\x64,路径的前段E:\Program Files (x86),根据VS安装位置决定,后段相似,路径之中的2017和14.10.25017根据VS版本决定 。
按Windows键打开开始菜单,寻找Developer Command Prompt for VS 2017或者VS 2017的开发人员命令提示符,其他版本VS的命令工具名称类似,右击弹出右键菜单,选择以管理员身份运行,出现如图界面:
切换至Boost根目录:
cd E:\Download\Boost\boost_1_68_0
执行以下命令:
bootstrap.bat msvc
生成b2.exe、bjam.exe、project-config.jam文件,b2.exe和bjam.exe都是构建工具,用于构建Boost库,而project-config.jam是配置文件。如下图所示:
许多资料说编辑project-config.jam文件,结果编译提示出错,如以下配置所示:
import option ;
using msvc : 14.1 : "E:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\cl.exe" ;
option.set keep-going : false ;
而不修改此文件,保持不变,成功编译。
执行以下命令编译Boost,编译项较多,编译时间由PC配置和系统状态决定。
b2.exe install --toolset=msvc-14.1 --prefix="E:\Download\Boost\boost_1_68_0" --build-type=complete threading=multi
不同VS版本对应MSVC版本如下表所示:
VS版本 | VS2003 | VS2005 | VS2008 | VS2010 | VS2012 | VS2013 | VS2015 | VS2017 | VS2019 |
---|---|---|---|---|---|---|---|---|---|
MSVC版本 | 7.0 | 8.0 | 9.0 | 10.0 | 11.0 | 12.0 | 14.0 | 15.0 | 16.0 |
编译完成之后,在Boost的根目录下可以看见bin.v2、include和lib三个文件夹,可以把编译产生的临时文件夹bin.v2删除。如下图所示:
b2命令参数形式:
b2 [options] [properties] [targets]
类型 | 可选项 | 说明 |
---|---|---|
targets | install | 复制include头文件夹和生成lib库文件夹。 |
targets | stage | 只生成lib库文件夹。由于include文件夹复制于Boost根目录的boost文件夹,因此可以直接使用boost文件夹。 |
options | –prefix | 以install方式编译时,指定与体系结构无关的文件存放目录。默认为C:\Boost。 |
options | –exec-prefix | 以install方式编译时,指定依赖于体系结构的文件存放目录。默认与–prefix相同。 |
options | –libdir | 以install方式编译时,指定库文件存放位置。默认为–prefix指定目录的lib文件夹。 |
options | –includedir | 以install方式编译时,指定头文件存放位置。默认为–prefix指定目录的include文件夹。 |
options | –stagedir | 以stage方式编译时,指定输出库目录。默认在Boost根目录生成stage文件夹,存放lib文件。 |
options | –build-type | 编译方式,默认最小编译,可以指定全编译。可选minimal/complete。 |
options | –build-dir | 编译产生的中间文件存放位置。默认于Boost根目录生成bin.v2文件夹,存放中间文件,在Boost编译完成之后可以删除。 |
options | –show-libraries | 展示需要构建和安装的Boost库列表。 |
options | –help | 介绍b2的使用方法和参数含义。 |
options | –with | 只编译指定库。 |
options | –without | 不编译指定库。 |
properties | toolset | 指定编译器版本,若不指定则自动搜索本地可用编译器。 |
properties | variant | 指定编译版本。可选debug/release,默认编译二者。 |
properties | link | 指定生成库为静态库或者动态库。可选static/shared。 |
properties | runtime-link | 指定运行时静态链接或者动态链接其他库。可选static/shared,默认编译二者。 |
properties | threading | 指定生成库为单线程或者多线程。可选single/multi,默认是multi。 |
打开Visual Studio 2017,在菜单栏内依次点击文件–>新建–>项目,如下图所示:
弹出新建项目窗口,左边依次展开已安装–>模板–>Visual C++,再选中Visual C++,右边选择空项目,在下边填写项目名称,选择性地修改项目存放的位置,最后点击确定,完成新建项目。如下图所示:
创建一文件夹,专门用来存放项目,便于统一管理项目。
项目一般不放在系统盘,避免系统崩溃时,找回项目遇到问题。
创建项目之后,在解决方案资源管理器窗口内,显示有项目组织结构,如下图所示:
右击项目的源文件文件夹,弹出右键菜单,依次选择添加–>新建项,详情见下图:
弹出添加新项窗口,如下图所示:
点开左上角的已安装,选中Visual C++,在右边窗格选择C++文件(.cpp),在下边填写源文件名称,位置默认,之后点击添加。
完成以上操作后,出现新建源文件的编辑窗口,如下图所示:
右击解决方案资源管理器窗口内项目,弹出右键菜单,选择属性,如下图所示:
弹出属性页窗口,左边依次展开配置属性–>C/C++,选中常规,查看右边SDL检查输入框内的设置,如下图所示:
若未设置或者设置为否(sdl-),直接点击取消。
如果原来设置为是(/sdl),单击输入框,点击输入框右边向下的尖角,出现两个选项,选择否(/sdl-),并且点击确定。如下图所示:
打开项目属性页窗口,左边依次展开属性配置–>C/C++,选中常规,在右边附加包含目录的输入框中,填入Boost库编译之后include文件夹所在路径。由于include文件夹中还有带boost版本命名的文件夹,因此填入的路径再接上那带boost版本的文件夹名。我的附加包含目录为E:\Download\Boost\boost_1_68_0\include\boost-1_68,如下图所示:
由于Boost的头文件和库文件多而且大,为避免复制耗时和项目臃肿,因此以绝对路径方式配置,待到打包应用时再拷贝需要的库文件,并以相对路径方式配置。
左边展开链接器,选中常规,在右边附加库目录的输入框中,填入Boost库编译之后生成的lib文件夹所在路径。我的附加库目录为E:\Download\Boost\boost_1_68_0\lib,如下图所示:
最后点击确定,完成Visual Studio 2017以绝对路径方式引用Boost库的步骤。
在创建的源文件中编写以下代码,测试Boost库是否导入成功。
#include
#include
#include
#include
using namespace boost::assign;
#define reverse_foreach BOOST_REVERSE_FOREACH
int main()
{
// 类似于C++标准的初始化列表
std::list<int> iList = list_of(1)(2)(3);
iList += 4, 5, 6;
push_back(iList)(7)(8)(9);
push_front(iList)(0);
reverse_foreach(auto& i, iList)
std::cout << i << ' ';
return 0;
}