下载 boost 压缩包,并解压
运行 booststrap.bat 批处理文件,这个文件会生成 b2.exe
b2.exe
是 Boost Build 工具的可执行文件,Boost Build 是用于构建 Boost 库以及基于 Boost 开发的项目的工具,它在 Boost 生态系统中扮演着重要角色,主要功能如下:- 编译 Boost 库:Boost 库包含大量的功能模块,如字符串处理、线程支持、智能指针等。
b2.exe
能够根据不同的平台(Windows、Linux、macOS 等)和编译选项,将 Boost 库的源代码编译成相应的库文件(静态库或动态库)。例如,在 Windows 系统上,使用b2.exe
可以生成.lib
(静态库)和.dll
(动态库)文件,方便在项目中使用 Boost 库的功能。 - 定制编译选项:允许开发者根据需求定制 Boost 库的编译行为。可以指定要编译的 Boost 模块,选择不同的优化级别、调试信息生成方式等。比如,开发者可以只编译项目中实际需要的 Boost 模块,以减少编译时间和库文件的大小。
- 构建基于 Boost 的项目:除了编译 Boost 库本身,
b2.exe
也可用于构建使用了 Boost 库的项目。它能够识别项目中的源文件、头文件以及与 Boost 库的依赖关系,按照正确的顺序进行编译和链接,生成可执行文件或其他目标产物。
- 编译 Boost 库:Boost 库包含大量的功能模块,如字符串处理、线程支持、智能指针等。
使用 b2.exe 编译的时候可以指定编译参数
1
.\b2.exe install --toolset=msvc-14.2 --build-type=complete --prefix="D:\cppsoft\boost_1_81_0" link=static runtime-link=shared threading=multi debug release
为什么 boost 中有些库不需要编译?
在 C++ 中,大多数仅包含头文件(header-only)的库不需要单独编译,原因主要与模板和内联函数的特性有关,以下是详细解释:
模板的实例化特性:模板是一种通用的编程工具,它允许编写可以处理不同数据类型的代码。对于模板函数或模板类,编译器在编译时并不知道具体的实例化类型,只有在使用模板的地方,编译器才会根据实际传入的类型来实例化模板。
内联函数的展开机制:内联函数是一种为了提高程序执行效率的机制。编译器在编译时会将内联函数的代码直接嵌入到调用它的地方,而不是像普通函数那样进行函数调用的开销。
编译单元的独立性:C++ 的编译过程是以源文件(
.cpp
)为单位进行的。每个源文件被单独编译成目标文件(.obj
或.o
),然后链接器将这些目标文件链接在一起生成可执行文件或库。如果头文件中的代码需要单独编译,就会破坏这种编译单元的独立性,因为每个包含该头文件的源文件都可能需要依赖于同一个头文件的编译结果,这会导致编译和链接过程变得复杂。而将所有代码都放在头文件中,每个包含该头文件的源文件都能独立地对其中的代码进行编译和实例化,不需要额外的链接步骤来处理头文件中的代码。
visual studio 中需要配置库,默认 b2.exe 编译生成的是静态库。
右键项目,属性
VC++目录,包含目录,包含进 boost 整个文件。在 Visual Studio 中,“VC++ 包含目录”(VC++ Include Directories)有着重要的作用,它主要用于指定编译器在编译 C++ 代码时查找头文件(
.h
或.hpp
等)的路径。配置库目录,这个主要用来包含静态库和动态库。选择 stage/lib 文件夹。
因为默认生成的是静态库,所以在 C++/代码生成 下的运行库选项要设置为
MTd
。上述步骤完成后测试代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
using namespace std;
cout << "Enter your weight: ";
float weight;
cin >> weight;
string gain = "A 10% increase raises ";
string wt = boost::lexical_cast<string> (weight);
gain = gain + wt + " to "; // string operator()
weight = 1.1 * weight;
gain = gain + boost::lexical_cast<string>(weight) + ".";
cout << gain << endl;
system("pause");
return 0;
}