CMake构建实战:项目开发卷
上QQ阅读APP看书,第一时间看更新

1.5.2 引用Boost C++头文件库

首先来尝试使用Boost中的头文件库。头文件库(header-only library)指只包含头文件(.h、.hpp等)的程序库。使用这种库非常方便,只需在程序中引用它的头文件,无须对库本身进行额外的编译。源程序引用头文件,相当于复制了头文件的内容,这样头文件库实际上也就成为了引用它的程序的一部分。所以使用头文件库只需编译引用它的程序,头文件库代码会自动被编译。

除了用起来简单,头文件库在性能方面也更具有优势。这是因为它能够直接被程序以源代码的形式引用,编译器能够更好地进行代码优化,如实现更多的函数内联,有助于提升程序的整体性能。

但其缺点也很明显,那就是影响编译时间。因为头文件库本身没有源程序,无法独立编译成目标文件,再被链接到使用它的程序中,这就不可避免地需要反复编译头文件中的程序。另外,分发头文件库也意味着开源是必需的了,毕竟需要用户来编译。这反映了头文件库的封装性相对较差。

总而言之,对于较为常用且简单的库,尤其是追求极致性能的库,使用头文件库的形式非常合适。最典型的例子可能就是C++的标准模板库(Standard Template Library,STL)了。

Boost中也有很多头文件库,本小节将使用Boost字符串算法库(Boost string algorithms library)来编写例程。主程序main.cpp如代码清单1.22所示。

代码清单1.22 ch001/头文件库/main.cpp

#include <boost/algorithm/string.hpp>
#include <iostream>
 
using namespace std;
using namespace boost;
 
int main() {
    string str = "  hello world!";
    cout << str << endl;
 
    to_upper(str);
    cout << str << endl;
 
    trim(str);
    cout << str << endl;
 
    return 0;
}

引用boost/algorithm/string.hpp头文件即可使用Boost字符串算法库。它提供了很多方便操作字符串的函数。主程序中使用to_upper函数将str转换为大写,使用trim函数去除str首尾的空白字符。

使用MSVC/NMake构建本例

Makefile如代码清单1.23所示。

代码清单1.23 ch001/头文件库/NMakefile

main.exe: main.cpp
    cl main.cpp /I "C:\boost" /EHsc /Fe"main.exe"
 
clean:
    del *.obj *.exe

这里为编译器提供了参数/I "C:\boost",表示将C:\boost添加到编译器的头文件搜索目录中,以便找到Boost头文件。

使用GCC/make构建本例

Makefile如代码清单1.24所示。

代码清单1.24 ch001/头文件库/Makefile

main: main.cpp
    g++ main.cpp -I ~/boost -o main
 
clean:
    rm main

GCC设定头文件搜索目录的参数是-I,其他设置与NMake Makefile几乎一样。