当前位置:   article > 正文

C/C++ 开源库及示例代码_ipc c++ 常用库

ipc c++ 常用库

转至:http://blog.csdn.net/x356982611/article/details/53187766?%3E

说明

本页面汇总俺收集的各种 C 和 C++ 的开源代码库,不定期更新。

如果你发现本页面的开源库有错漏之处,非常欢迎给俺提供反馈——有 GitHub 帐号的同学,可以给俺发 issue;没帐号的同学,可以去俺博客留言。


1 综合性的库

Boost

Home:http://boost.org/

Wikipedia: 英文 中文

Boost 大概是最重要的第三方 C++ 库。其作者有很多是 C++ 标准委员会的成员。Boost 的很多子库后来都成为 C++ 的标准库。

本页面的其它章节还会继续提及 Boost 在各种领域的应用。

wxWidgets

Home:https://wxwidgets.org/

Wikipedia: 英文 中文

这是一个非常老牌的 C++ 开源 GUI 框架,诞生于1992年。原先叫做 wxWindows,后来因为微软的法律纠纷,改为现名。

它支持的操作系统平台很多(包括嵌入式系统)。

很多开源项目用到它,比如:BitTorrent、aMule、FileZilla、Code::Blocks、Dolphin……

虽然它以 GUI 为主,但是也提供了其它一些辅助功能(比如:进程间通讯、网络、数据库、多媒体……)

Qt

Home:http://www.qt-project.org/

Wikipedia: 英文 中文

这是一个非常老牌的 C++ 开源 GUI 框架,于1995年发布 1.0 版本。原先由 Trolltech 公司维护,后来该公司被 Nokia 收购。

它支持的操作系统平台很多(包括嵌入式系统)。

虽然它以 GUI 为主,但是也提供了其它一些辅助功能(比如:网络、数据库、多媒体、3D引擎……)

APR(Apache Portable Runtime)

Home:https://apr.apache.org/

Wikipedia: 英文 中文

这是由 Apache 社区维护的 C 开源库,主要提供操作系统相关的功能(文件系统、进程、线程、用户、IPC)。此外还提供了一些网络相关的功能。

APR 原先是 Apache Web 服务器的一个组成部分,后来独立出来,成为一个单独的开源项目。

ACE(Adaptive Communication Environment)

Home:ACE

Wikipedia:英文 中文

这是一个跨平台的 C++ 库,提供了一套网络通讯的框架;另外还支持线程、进程和 IPC。

POCO

Home:POCO

Wikipedia: 英文

它的名称源自“POrtable COmponents”,是一个基于 C++ 的开源库。

它的功能以网络通讯为主,同时也提供一些其它功能(比如:多线程、进程间通讯、数据库、XML、JSON……)

Dlib

Home:[http://dlib.net/]

Wikipedia:英文

诞生于2002年的 C++ 开源库,提供了非常多的功能(网络、多线程、GUI、数值计算、图像处理、数据挖掘……)。

它还有一个特色是:同时提供了 Python API :)

Crypto++

Home:http://www.cryptopp.com/

Wikipedia: 英文

它也叫“CryptoPP”或“libcrypto++”,是非常著名的开源加密库,诞生于1995年。基于 C++ 开发,大量用到模板语法。

虽然它以加密为主,但是也提供了其它一些辅助功能(比如:数据压缩、编码解码、计时器…)


2 数据结构 & 算法 =

2.1 容器

2.1.1 标准容器

std

C++ 98 标准内置的 STL 提供了如下容器:

  • 数组:vector(动态数组)、valarray(针对数值类型特化的 vector)、bitset(储存比特的【固定】数组)

  • 链表:list(双向)

  • 队列:queue、deque(双端队列)

  • 栈:stack

  • 映射:map(键值无重复)、multimap(键值可重复)

  • 集合:set(元素无重复)、multiset(元素可重复)

C++ 11 标准新增了如下容器:

  • 数组:array(相比 vector,它的 size 是编译时【固定】的)

  • 链表:forward_list(相比 list,它是【单向】的)

  • 映射:unordered_map、unordered_multimap(相比 map 和 multimap,这俩采用 hash 实现)

  • 集合:unordered_set、unordered_multiset(相比 set 和 multiset,这俩采用 hash 实现)

下面几个容器,C++ 标准【没有】包含,但包含在某些知名的 STL 第三方库中(比如 SGI 的 STL):

  • 映射:hash_map、hash_multimap(与 unordered_map、unordered_multimap 相同)

  • 集合:hash_set、hash_multiset(与 unordered_set、unordered_multiset 相同)

2.1.2 Lockfree 的容器

(“lock-free”翻译成“锁无关”会引发歧义,所以俺直接用洋文)

Boost.Lockfree

Docs:http://boost.org/libs/lockfree

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了三种 lock-free 的容器(queue、stack、spsc_queue)。最后这种是“环形缓冲”。

libcds(Concurrent Data Structures)

Home:http://libcds.sourceforge.net/

这是一个跨平台的 C++ 开源库,提供了若干 lock-free 的容器。它的 2.0.0 版本,代码重写以支持 C++ 11 标准。

2.1.3 环形缓冲

Boost.CircularBuffer

Docs:http://boost.org/libs/circular_buffer

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了“环形缓冲区”的模板。

“环形缓冲区”可以降低内存分配的开销。俺曾经写过一篇博文推荐环形缓冲区(在“这里”)。

代码示例

  1. include <boost/circular_buffer.hpp>
  2. boost::circular_buffer<int> cb(3); // Create with capacity for 3 integers
  3. cb.push_back(1);
  4. cb.push_back(2);
  5. cb.push_back(3);
  6. // The buffer is full now
  7. // pushing subsequent elements will overwrite front-most elements.
  8. cb.push_back(4); // Overwrite 1 with 4.
  9. cb.push_back(5); // Overwrite 2 with 5.
  10. // The buffer now contains 3, 4 and 5.
  11. // Elements can be popped from either the front or the back.
  12. cb.pop_back(); // 5 is removed.
  13. cb.pop_front(); // 3 is removed.
  14. // Leaving only one element with value = 4.
  15. assert(cb[0] == 4);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

2.1.4 多维数组

Boost.MultiArray

Docs:MultiArray

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了任意维的数组。

代码示例——3维数组

  1. include <boost/multi_array.hpp>
  2. typedef boost::multi_array<double, 3> array_type;
  3. typedef array_type::index index;
  4. array_type A(boost::extents[3][4][2]);
  5. int values = 0;
  6. for(index i=0; i!=3; ++i)
  7. for(index j=0; j!=4; ++j)
  8. for(index k=0; k!=2; ++k)
  9. A[i][j][k] = values++;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2.1.5 图

Boost.Graph

Docs:Graph

Boost 前面已经介绍过。这是 Boost 的其中一个子库,简称 BGL(Boost Graph Library),封装了“图”这种数据结构。

它提供了与 STL 类似的泛型编程风格。

Dlib

Docs:DLib

Dlib 前面已经介绍过。它提供了2个类(graph & directed_graph)封装“图”。

2.2 对容器的操作

(STL 标准库里面已经实现了很多算法用来操作容器,考虑到本页面已经很长,这里只列举第三方库实现的算法)

Boost.Foreach

Docs:Foreach

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了通用的遍历,其效果类似于 Python 的 for 循环语法。

有了它,你在遍历时无需声明迭代器变量,也无需关心遍历的容器是何种类型。

代码示例——遍历字符串

  1. include <string>
  2. include <iostream>
  3. include <boost/foreach.hpp>
  4. std::string test("Hello, world!"); // string 可以视为 char 的容器
  5. BOOST_FOREACH(char ch, test)
  6. {
  7. std::cout << ch;
  8. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.3 字符串处理

2.3.1 字符集

Boost.Locale

Docs:locale

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了各种“本地化”的功能。其中就包括字符集编码转换。

代码示例

  1. include <fstream>
  2. include <boost/locale.hpp>
  3. using namespace boost::locale;
  4. std::locale loc = generator().generate("he_IL.UTF-8");
  5. std::wofstream file.
  6. file.imbue(loc);
  7. file.open("hello.txt");
  8. file << L"שלום!";
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
POCO.Text

Docs:Text

POCO 前面已经介绍过。它提供了 UTF8/UTF16/UTF32 的转换。

2.3.2 字符串格式化

Boost.Format

Docs:Format

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了“格式化字符串”的功能。相比 ANSI C 的 sprintf() 和 snprintf(),它的格式化功能更强并且更安全。

代码示例

  1. include <iostream>
  2. include <boost/format.hpp>
  3. using std::cout;
  4. using boost::format;
  5. // 基于“位置指示符”的格式串语法
  6. cout << format("%1% %2% %3% %2% %1%") % "11" % "22" % "333";
  7. // 输出如下:
  8. // 11 22 333 22 11
  9. // 兼容 printf() 的格式串语法
  10. cout << format("%s %d") % "price" % 1234;
  11. // 输出如下:
  12. // price 1234
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
fmt

Home:https://github.com/fmtlib/fmt

这是一个轻量级、类型安全、高性能的字符串格式化库。它也可以用来替代 C++ 标准库中的 IOStreams。

代码示例

  1. include <string>
  2. include <fmt/format.h>
  3. // 使用 Python 的格式化语法
  4. fmt::print("Hello, {}!", "world");
  5. // 使用 printf 的格式化语法
  6. fmt::printf("Hello, %s!", "world");
  7. // 使用序号参数,
  8. std::string s = fmt::format("{0} {1} {0}", "Hello", "world");
  9. // 使用命名参数
  10. fmt::print("Hello, {name}! The answer is {number}. Goodbye, {name}.",
  11. fmt::arg("name", "World"), fmt::arg("number", 42));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.3.3 正则表达式

PCRE(Perl Compatible Regular Expressions)

Home:http://www.pcre.org/

Wikipedia:英文

这是一个很老牌的正则表达式的库,诞生于1997年。很多知名的开源项目(Apache、PHP、KDE)用到了它。

Boost.Regex

Docs:Regex

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了“正则式”的功能。

注:Boost 的这个子库已经进入 C++ 11 标准。

代码示例——基于正则式进行匹配和替换

  1. include <boost/regex.hpp>
  2. using std::string;
  3. using namespace boost;
  4. // 正则式匹配的例子
  5. bool validate_card_format(const string& s)
  6. {
  7. const regex e("(\\d{4}[- ]){3}\\d{4}");
  8. return regex_match(s, e);
  9. }
  10. // 正则式替换的例子
  11. const regex e("\\A(\\d{3,4})[- ]?(\\d{4})[- ]?(\\d{4})[- ]?(\\d{4})\\z");
  12. const string machine_format("\\1\\2\\3\\4");
  13. const string human_format("\\1-\\2-\\3-\\4");
  14. string machine_readable_card_number(const string& s)
  15. {
  16. return regex_replace(s, e, machine_format, match_default|format_sed);
  17. }
  18. string human_readable_card_number(const string& s)
  19. {
  20. return regex_replace(s, e, human_format, match_default|format_sed);
  21. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
re2

Home:https://github.com/google/re2

这是 Google 提供的正则式库,基于 C++。其 API 使用起来很简洁。

有多种脚本语言(Python、Ruby、Perl、Node.js、Erlang、OCaml)提供了对它的封装。

代码示例——基于正则式进行匹配

  1. include <re2/re2.h>
  2. int i;
  3. string s;
  4. assert(RE2::FullMatch("test:1234", "(\\w+):(\\d+)", &s, &i));
  5. assert(s == "test");
  6. assert(i == 1234);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
Oniguruma(鬼车)

Home:http://www.geocities.jp/kosako3/oniguruma/

Wikipedia: 英文

来自日本的正则式库,基于 C 语言。据说性能很高。

它被用在 Ruby、TextMate、Sublime Text、SubEthaEdit 等软件上。

POCO.RegExp

Docs:http://pocoproject.org/docs/package-Foundation.RegExp.html

POCO 前面已经介绍过。它提供了正则表达式的封装类。

Qt.QRegExp

Docs:http://doc.qt.io/qt-4.8/qregexp.html

Qt 前面已经介绍过。这是 Qt 中的一个类,提供了“正则式”的功能。

2.3.4 (其它)

Boost.StringAlgorithms

Docs:http://boost.org/libs/algorithm/string

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了各种字符串的算法(替换、合并、拆分、大小写转换、trim……)。

代码示例——字符串合并

  1. include <string>
  2. include <vector>
  3. include <iostream>
  4. include <boost/algorithm/string.hpp>
  5. std::vector<std::string> v;
  6. // 此处填充 v
  7. std::cout << boost::algorithm::join(v, " ") << '\n';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
Boost.Lexical_Cast

Docs:http://boost.org/libs/lexical_cast

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了各种字符串与其它类型的转换。

注:Boost 的这个子库已经进入 C++ 11 标准。

代码示例

  1. include <string>
  2. include <iostream>
  3. include <boost/lexical_cast.hpp>
  4. std::string s = boost::lexical_cast<std::string>(123);
  5. std::cout << s << '\n';
  6. double d = boost::lexical_cast<double>(s);
  7. std::cout << d << '\n';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2.4 内存相关

2.4.1 智能指针

Boost.SmartPointers

Docs:http://boost.org/libs/smart_ptr

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了几种智能指针。最常用的是“shared_ptr”。

有了智能指针,你就无需操心 new 之后的 delete 了。

注:Boost 的这个子库已经进入 C++ 11 标准。

2.4.2 内存池

Boost.Pool

Docs:http://boost.org/libs/pool

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了“内存池”的功能。

Dlib

Docs:http://dlib.net/other.html

Dlib 前面已经介绍过。它提供了内存池(参见文档中以“memory_manager”开头的类)。

APR

Docs:https://apr.apache.org/docs/apr/trunk/modules.html

APR 前面已经介绍过。它提供了内存池的功能。

2.5 时间 & 日期

Boost.Date_Time

Docs:http://boost.org/libs/date_time

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了针对“日期 和 时间”的各种处理。

POCO.DateTime

Docs:DateTime

POCO 前面已经介绍过。它提供了若干个日期和时间的封装类(时区转换、格式化字符串、解析时间字符串)。

2.6 编码 & 解码

2.6.1 序列化

Boost.Serialization

Docs:serialization

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了【可定制的】“序列化”功能。

2.6.2 Base64

Base64 是一组编码算法的总称。用于把二进制数据编码为文本。

Boost.Serialization

Docs:serialization

Boost 前面已经介绍过。使用前面提到的“Boost.Serialization”,你可以定制采用 Base64 方式进行编码和解码。

Crypto++

Docs:Crypto++

Crypto++ 前面已经介绍过。它提供了6个类,分别用于 Base64、Base32、Base16 的编码/解码。

POCO.Streams

Docs:Streams

POCO 前面已经介绍过。它提供了 Base64 和 Base32 的编码/解码。

2.7 (其它)

2.7.1 随机数

std

ANSI C 在 stdlib.h 中提供了随机数生成函数 rand()。使用前记得先用 srand() 函数播种,否则就傻了。

Boost.Random

Docs:Random

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了“随机数生成”的功能。

相比 ANSI C 的随机数函数,它提供的功能更丰富。

代码示例

  1. include <ctime>
  2. include <boost/random.hpp>
  3. double SampleNormal(double mean, double sigma)
  4. {
  5. using namespace boost;
  6. // 建立一个 Mersenne twister 随机数产生器,使用当前时间播种
  7. static mt19937 rng(static_cast<unsigned>(std::time(NULL)));
  8. // 选择高斯机率分布
  9. normal_distribution<double> norm_dist(mean, sigma);
  10. // 使用 function 的形式,生成随机数据产生器
  11. variate_generator<mt19937&, normal_distribution<double> > normal_sampler(rng, norm_dist);
  12. // 传回样本分布结果
  13. return normal_sampler();
  14. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
Crypto++

Docs:Crypto++

Crypto++ 前面已经介绍过。它提供了好几个类,用于随机数生成。

2.7.2 UUID

Boost.UUID

Docs:UUID

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了 UUID 的生成。

代码示例——生成 UUID

  1. include <boost/uuid/uuid.hpp>
  2. include <boost/uuid/uuid_generators.hpp>
  3. // uuid 类以 POD 方式实现,可以直接用在 memcpy()
  4. unsigned char uuid_data[16];
  5. boost::uuids::uuid u;
  6. memcpy(&u, uuid_data, 16);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
APR

Docs:[https://apr.apache.org/docs/apr/trunk/modules.html]

APR 前面已经介绍过。它提供了 UUID 的生成、格式化成字符串、解析 UUID 字符串。

POCO.UUID

Docs:[http://pocoproject.org/docs/package-Foundation.UUID.html]

POCO 前面已经介绍过。它提供了 UUID 的生成、格式转换。


3 编程范式

(这一章节主要针对 C++——“支持多范式”是 C++ 的一大特色)

3.1 面向对象编程(OOP)

fruit

Home:[https://github.com/google/fruit]

它是 Google 开发的 C++ 库,提供了“依赖注入”(dependency injection)的框架。

代码示例——一个简单的例子

  1. include <iostream>
  2. include <fruit/fruit.h>
  3. using fruit::Component;
  4. using fruit::Injector;
  5. class Writer
  6. {
  7. public:
  8. virtual void write(std::string str) = 0;
  9. };
  10. class StdoutWriter : public Writer
  11. {
  12. public:
  13. // Like "StdoutWriter() = default;" but also marks this constructor as the
  14. // one to use for injection.
  15. INJECT(StdoutWriter()) = default;
  16. virtual void write(std::string str) override
  17. {
  18. std::cout << str;
  19. }
  20. };
  21. class Greeter
  22. {
  23. public:
  24. virtual void greet() = 0;
  25. };
  26. class GreeterImpl : public Greeter
  27. {
  28. private:
  29. Writer* writer;
  30. public:
  31. // Like "GreeterImpl(Writer* writer) {...}"
  32. // but also marks this constructor as the one to use for injection.
  33. INJECT(GreeterImpl(Writer* writer))
  34. : writer(writer)
  35. {
  36. }
  37. virtual void greet() override
  38. {
  39. writer->write("Hello world!\n");
  40. }
  41. };
  42. Component<Greeter> getGreeterComponent()
  43. {
  44. return fruit::createComponent()
  45. .bind<Writer, StdoutWriter>()
  46. .bind<Greeter, GreeterImpl>();
  47. }
  48. int main()
  49. {
  50. Injector<Greeter> injector(getGreeterComponent());
  51. Greeter* greeter = injector.get<Greeter*>();
  52. greeter->greet();
  53. return 0;
  54. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

3.2 泛型编程(GP)

Boost.TypeTraits

Docs:http://boost.org/libs/type_traits

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了“类型特化”相关的辅助功能。

3.3 函数式编程(FP)

(不了解“函数式编程”的同学,可以先看维基百科

Boost.Function

Docs:http://boost.org/libs/function

Boost 前面已经介绍过。这是 Boost 的其中一个子库,用来辅助封装函数对象(仿函式)。

注:Boost 的这个子库已经进入 C++ 11 标准。

代码示例——封装标准 C 的函数

  1. include <cstdlib>
  2. include <cstring>
  3. include <iostream>
  4. include <boost/function.hpp>
  5. boost::function<int(const char*)> f = std::atoi;
  6. std::cout << f("42") << '\n';
  7. f = std::strlen;
  8. std::cout << f("42") << '\n';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
Boost.Lambda

Docs:http://boost.org/libs/lambda

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了“匿名函数/无名函数”的功能。

注:Boost 的这个子库已经进入 C++ 11 标准。

代码示例

  1. include <vector>
  2. include <algorithm>
  3. include <iostream>
  4. include <boost/lambda/lambda.hpp>
  5. std::vector<int> v;
  6. // 此处填充 v
  7. std::for_each(v.begin(), v.end(),
  8. std::cout << boost::lambda::_1 << "\n");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3.4 元编程(Metaprogramming)

(不知道何为“元编程”,可以先看维基百科

Boost.MPL

Docs:http://boost.org/libs/mpl

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了“模板元编程”的框架。

Dlib

Docs:http://dlib.net/metaprogramming.html

Dlib 前面已经介绍过。它提供了“模板元编程”的辅助类。


4 调试 & 测试

4.1 调试日志

Boost.Log

Docs:http://boost.org/libs/log

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了记录日志的机制。

下面给出的示例是最简单的版本,其实它还提供了很丰富的扩展机制。

代码示例

  1. include <boost/log/trivial.hpp>
  2. BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
  3. BOOST_LOG_TRIVIAL(info) << "An informational severity message";
  • 1
  • 2
  • 3
  • 4
POCO.Logging

Docs:http://pocoproject.org/docs/package-Foundation.Logging.html

POCO 前面已经介绍过。它提供了好几个用于调试日志的封装类(包括特定于 Windows 平台和特定于 POSIX 平台的类)。

它还支持日志文件的循环存储。

Dlib

Docs:http://dlib.net/other.html#logger

Dlib 前面已经介绍过。它提供了风格类似 log4j 的日志记录机制。

代码示例

  1. include <dlib/logger.h>
  2. include <dlib/misc_api.h>
  3. using namespace dlib;
  4. logger dlog("example");
  5. dlog.set_level(LALL);
  6. dlog << LINFO << "This is an informational message.";
  7. int variable = 8;
  8. dlog << LDEBUG << "The integer variable is set to " << variable;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
wxWidgets

Docs:http://docs.wxwidgets.org/trunk/group__group__funcmacro__log.html

wxWidgets 前面已经介绍过。它提供了记录日志的函数和宏。

log4cpp

Home:http://log4cpp.sourceforge.net/

如其名,这是一个模仿 log4j 的 C++ 库。支持多种操作系统(包括 Windows)。

4.2 单元测试

Boost.Test

Docs:http://boost.org/libs/test

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了与测试相关的各种辅助工具(包括单元测试)。

Google Test

Home:https://github.com/google/googletest

Wikipedia: 英文

这是 Google 提供的单元测试框架。从 Google Code 迁移到 GitHub 之后,又整合了 GoogleMock 项目。

一些知名的开源项目(Chromium、LLVM、OpenCV)用到了它。

CppUnit

Home:http://freedesktop.org/wiki/Software/cppunit/

Wikipedia:英文

如其名,这是一个 C++ 的单元测试框架。该项目起先是作为 JUnit 的 C++ 移植而创建的。

Check

Home:http://check.sourceforge.net/

Wikipedia: 英文

这是针对 C 的单元测试框架。

代码示例

  1. include <check.h>
  2. /* The basic unit test looks as follows: */
  3. START_TEST (test_name)
  4. {
  5. /* unit test code */
  6. }
  7. END_TEST
  8. /* The "START_TEST/END_TEST" pair are macros that setup basic structures to permit testing.
  9. It is a mistake to leave off the END_TEST marker;
  10. doing so produces all sorts of strange errors when the check is compiled. */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4.3 健壮性测试

Boost.Test.ExecutionMonitor

Docs:http://boost.org/libs/test/doc/html/execution-monitor.html

Boost 前面已经介绍过。这是 Boost 的其中一个子库,它除了提供“单元测试”,还提供“内存泄漏的检测”。

4.4 性能测试

benchmark

Home:https://github.com/google/benchmark

这是 Google 提供的性能测试辅助工具,用来测试指定函数的执行时间。

它可以把测试结果导出为 CSV 或 JSON 格式。


5 操作系统

5.1 跨操作系统

5.1.1 文件系统

Boost.Filesystem

Docs:http://boost.org/libs/filesystem

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了对“文件系统”的操作。

代码示例——获取文件大小

  1. include <iostream>
  2. include <boost/filesystem.hpp>
  3. int main(int argc, char* argv[])
  4. {
  5. using namespace boost::filesystem;
  6. if(argc != 2)
  7. {
  8. std::cout << "Usage: \n" << argv[0] << " path\n";
  9. return 1;
  10. }
  11. std::cout << argv[1] << " " << file_size(argv[1]) << '\n';
  12. return 0;
  13. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
POCO.Filesystem

Docs:http://pocoproject.org/docs/package-Foundation.Filesystem.html

POCO 前面已经介绍过。它提供了文件系统相关的封装类(遍历目录和文件、通配符匹配、临时文件、文件变化通知…)。

wxWidgets

Docs:http://docs.wxwidgets.org/trunk/group__group__class__file.html

wxWidgets 前面已经介绍过。它提供了文件系统相关的封装类(遍历目录和文件、临时文件、文件变化通知…)。

APR

Docs:https://apr.apache.org/docs/apr/trunk/modules.html

APR 前面已经介绍过。它提供了“文件信息、文件名匹配”等功能。

5.1.2 线程

Boost.Thread

Docs:http://boost.org/libs/thread

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了“多线程”的功能。

代码示例

  1. include <iostream>
  2. include <boost/thread/thread.hpp>
  3. void hello_world()
  4. {
  5. std::cout << "Hello world, I'm a thread!\n";
  6. }
  7. int main()
  8. {
  9. boost::thread my_thread(&hello_world); // 启动一个线程
  10. my_thread.join(); // 等待该线程结束
  11. return 0;
  12. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
ACE

Docs:http://www.dre.vanderbilt.edu/Doxygen/Stable/libace-doc/annotated.html

ACE 前面已经介绍过。它提供了“多线程”的功能(参见文档中以“ACE_Thread”开头的类)

APR

Docs:https://apr.apache.org/docs/apr/trunk/modules.html

APR 前面已经介绍过。它提供了“线程池、线程同步/互斥”等功能,以及一些线程安全的数据结构。

POCO.Threading

Docs:http://pocoproject.org/docs/package-Foundation.Threading.html

POCO 前面已经介绍过。它提供了线程、线程池以及线程同步/互斥的封装类。

wxWidgets

Docs:http://docs.wxwidgets.org/trunk/group__group__class__threading.html

wxWidgets 前面已经介绍过。它提供了线程以及线程同步/互斥的封装类。

GNU Common C++

Home:http://www.gnu.org/software/commoncpp/

由 GNU 提供的一套跨平台的线程并发框架。

5.1.3 进程

ACE

Docs:http://www.dre.vanderbilt.edu/Doxygen/Stable/libace-doc/annotated.html

ACE 前面已经介绍过。它提供了“进程管理”的功能(参见文档中以“ACE_Process”开头的类)。

APR

Docs:https://apr.apache.org/docs/apr/trunk/modules.html

APR 前面已经介绍过。它提供了“进程管理”的功能。

POCO.Processes

Docs:http://pocoproject.org/docs/Poco.Process.html

POCO 前面已经介绍过。它提供了“进程”的封装类。

5.1.4 本地进程间通信(IPC)

(本章节列举的是【本地】IPC,跨主机的网络通讯,参见本页面后续的章节)

Boost.Interprocess

Docs:http://boost.org/libs/interprocess

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了共享内存和几种同步机制(Mutexes、Condition variables、Semaphores、Upgradable mutexes、File locks)。

ACE

Docs:http://www.dre.vanderbilt.edu/Doxygen/Stable/libace-doc/annotated.html

ACE 前面已经介绍过。它提供了许多种 IPC 机制(有些不是跨平台的)。

APR

Docs:https://apr.apache.org/docs/apr/trunk/modules.html

APR 前面已经介绍过。它提供了“进程同步、共享内存、信号处理”等功能。

POCO.Processes

Docs:http://pocoproject.org/docs/package-Foundation.Processes.html

POCO 前面已经介绍过。它提供了 IPC 相关的封装类(“共享内存”和“管道”)。

5.2 特定于 Windows 系统

5.2.1 注册表

wxWidgets

Docs:http://docs.wxwidgets.org/trunk/classwx_reg_key.html

wxWidgets 前面已经介绍过。它提供了操作 Windows 注册表的封装类。

POCO::Util

Docs:http://pocoproject.org/docs/Poco.Util.html

POCO 前面已经介绍过。它提供了操作 Windows 注册表的封装类(WinRegistryKey)。

5.2.2 Windows 服务(Service)

POCO::Util

Docs:http://pocoproject.org/docs/Poco.Util.html

POCO 前面已经介绍过。它提供了相应的封装类(WinService),可以用来操作 Service(注册、删除、启动、停止)。

5.3 特定于 Linux & Unix 系统


6 图形用户界面(GUI)

6.1 GUI 框架

6.1.1 跨平台的 GUI 框架

wxWidgets

Docs:http://docs.wxwidgets.org/trunk/modules.html

wxWidgets 前面已经介绍过。用 wxWidgets 开发 GUI 应用,其代码结构类似 MFC。熟悉 MFC 的程序员应该很容易上手。

代码示例——Hello world

  1. include <wx/wxprec.h>
  2. ifndef WX_PRECOMP
  3. include <wx/wx.h>
  4. endif
  5. class MyApp: public wxApp
  6. {
  7. public:
  8. virtual bool OnInit();
  9. };
  10. wxIMPLEMENT_APP(MyApp);
  11. class MyFrame: public wxFrame
  12. {
  13. public:
  14. MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
  15. private:
  16. void OnExit(wxCommandEvent& event);
  17. wxDECLARE_EVENT_TABLE();
  18. };
  19. wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
  20. EVT_MENU(wxID_EXIT, MyFrame::OnExit)
  21. wxEND_EVENT_TABLE()
  22. bool MyApp::OnInit()
  23. {
  24. MyFrame* frame = new MyFrame("Hello, World", wxPoint(50, 50), wxSize(450, 340));
  25. frame->Show(true);
  26. return true;
  27. }
  28. MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
  29. : wxFrame(NULL, wxID_ANY, title, pos, size)
  30. {
  31. wxMenu* menuFile = new wxMenu();
  32. menuFile->Append(wxID_EXIT);
  33. wxMenuBar* menuBar = new wxMenuBar();
  34. menuBar->Append(menuFile, "&File");
  35. SetMenuBar(menuBar);
  36. }
  37. void MyFrame::OnExit(wxCommandEvent& event)
  38. {
  39. Close(true);
  40. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
Qt

Qt 前面已经介绍过。下面给出一个 Hello world 的示例,让你看看 Qt 的风格。

代码示例——Hello world

  1. include <QtWidgets/QApplication>
  2. include <QtWidgets/QLabel>
  3. int main(int argc, char* argv[])
  4. {
  5. QApplication app(argc, argv);
  6. QLabel label("Hello, world!");
  7. label.show();
  8. return app.exec();
  9. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
GTK+

Home:http://www.gtk.org/

Wikipedia:英文中文

老牌的 GUI 框架,诞生于1998年。原先叫做“GIMP Toolkit”,是基于 C 开发的跨平台界面组件库。

代码示例——Hello world

  1. include <gtk/gtk.h>
  2. int main(int argc, char* argv[])
  3. {
  4. gtk_init(&argc, &argv);
  5. GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  6. gtk_window_set_title(GTK_WINDOW(window), "Hello, world!");
  7. gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  8. gtk_window_set_default_size(GTK_WINDOW(window), 200, 100);
  9. /*
  10. ** Map the destroy signal of the window to gtk_main_quit;
  11. ** When the window is about to be destroyed, we get a notification and
  12. ** stop the main GTK+ loop by returning 0
  13. */
  14. g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
  15. gtk_widget_show_all(window);
  16. /* Start the main loop, do nothing until the application is closed */
  17. gtk_main();
  18. return 0;
  19. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
FLTK

Home:http://www.fltk.org/

Wikipedia: 英文 中文

它的全称是“Fast, Light Toolkit”。如其名,它非常轻量级。用它写一个“Hello World 应用”,静态链接后大约才 100KB

代码示例——Hello world

  1. include <FL/Fl.H>
  2. include <FL/Fl_Window.H>
  3. include <FL/Fl_Box.H>
  4. int main(int argc, char **argv)
  5. {
  6. Fl_Window* window = new Fl_Window(300, 180);
  7. Fl_Box* box = new Fl_Box(20, 40, 260, 100, "Hello, World!");
  8. box->box(FL_UP_BOX);
  9. box->labelsize(36);
  10. box->labelfont(FL_BOLD+FL_ITALIC);
  11. box->labeltype(FL_SHADOW_LABEL);
  12. window->end();
  13. window->show(argc, argv);
  14. return Fl::run();
  15. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

6.1.2 特定于 Windows 的 GUI 框架

WTL(Windows Template Library)

Home:http://sourceforge.net/projects/wtl/

Wikipedia: 英文中文

这是微软雇员 Nenad Stefanovic 开发的开源 GUI 框架。开发 WTL 是为了提供一个轻量级的 MFC 替代品。

6.2 图表(Chart)

Qt

Docs:http://doc.qt.io/QtCharts/

Qt 前面已经介绍过。它内置了一套 Chart 的封装类。

代码示例——饼图

  1. include <QtWidgets/QApplication>
  2. include <QtWidgets/QMainWindow>
  3. include <QtCharts/QChartView>
  4. include <QtCharts/QPieSeries>
  5. include <QtCharts/QPieSlice>
  6. QT_CHARTS_USE_NAMESPACE
  7. int main(int argc, char* argv[])
  8. {
  9. QApplication app(argc, argv);
  10. QPieSeries* series = new QPieSeries();
  11. series->append("Jane", 1);
  12. series->append("Joe", 2);
  13. series->append("Andy", 3);
  14. series->append("Barbara", 4);
  15. series->append("Axel", 5);
  16. QPieSlice* slice = series->slices().at(1);
  17. slice->setExploded();
  18. slice->setLabelVisible();
  19. slice->setPen(QPen(Qt::darkGreen, 2));
  20. slice->setBrush(Qt::green);
  21. QChart* chart = new QChart();
  22. chart->addSeries(series);
  23. chart->setTitle("Simple piechart example");
  24. chart->legend()->hide();
  25. QChartView* chartView = new QChartView(chart);
  26. chartView->setRenderHint(QPainter::Antialiasing);
  27. QMainWindow window;
  28. window.setCentralWidget(chartView);
  29. window.resize(400, 300);
  30. window.show();
  31. return app.exec();
  32. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
wxCode

Home:http://wxcode.sourceforge.net/

该项目专门提供组件来扩展 wxWidgets 的功能。它里面提供了好几种图表的组件(wxChart、wxFreeChart、wxPlotCtrl)。

wxMathPlot

Home:http://wxmathplot.sourceforge.net/

看名称就知道它是跟 wxWidgets 搭配的。效果图参见“ 这里


7 文本用户界面(TUI)

7.1 命令行参数

getopt

Home:https://www.gnu.org/software/libc/manual/html_node/Getopt.html

Wikipedia:英文

这是标准C用来处理命令行参数的老牌函数,诞生于上世纪80年代初期。

它有很多种不同的实现,如今用得最多的是 GNU C Library 的实现。GNU 还实现了一个增强版 getopt_long。

代码示例

  1. include <stdio.h> /* for printf */
  2. include <stdlib.h> /* for exit */
  3. include <unistd.h> /* for getopt */
  4. int main(int argc, char** argv)
  5. {
  6. int digit_optind = 0;
  7. int aopt = 0, bopt = 0;
  8. char* copt = NULL;
  9. char* dopt = NULL;
  10. int c;
  11. while( (c = getopt(argc, argv, "abc:d:012")) != -1)
  12. {
  13. int this_option_optind = optind ? optind : 1;
  14. switch(c)
  15. {
  16. case '0':
  17. case '1':
  18. case '2':
  19. if(digit_optind != 0 && digit_optind != this_option_optind)
  20. {
  21. printf("digits occur in two different argv-elements.\n");
  22. }
  23. digit_optind = this_option_optind;
  24. printf("option %c\n", c);
  25. break;
  26. case 'a':
  27. printf("option a\n");
  28. aopt = 1;
  29. break;
  30. case 'b':
  31. printf("option b\n");
  32. bopt = 1;
  33. break;
  34. case 'c':
  35. printf("option c with value '%s'\n", optarg);
  36. copt = optarg;
  37. break;
  38. case 'd':
  39. printf("option d with value '%s'\n", optarg);
  40. dopt = optarg;
  41. break;
  42. case '?':
  43. break;
  44. default:
  45. printf("?? getopt returned character code 0%o ??\n", c);
  46. }
  47. }
  48. if(optind < argc)
  49. {
  50. printf("non-option ARGV-elements: ");
  51. while(optind < argc)
  52. {
  53. printf("%s ", argv[optind++]);
  54. }
  55. printf("\n");
  56. }
  57. exit (0);
  58. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
Boost.Program_options

Docs:http://boost.org/libs/program_options

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了“处理命令行参数”的功能。

它的功能很丰富,但是比较重型。

7.2 文本终端

ncurses

Home:https://www.gnu.org/software/ncurses/

Wikipedia: 英文 中文

ncurses 是“new curses”的缩略词,它是 curses 库的自由软件克隆,诞生于1993年。

大名鼎鼎的 Eric S. Raymond 曾参与早期版本的开发。

8 网络

8.1 链路层 & 网络层

libpcap

Home:http://www.tcpdump.org/

Wikipedia: 英文

很著名的 Sniffer 抓包库,基于 C 语言开发。

代码示例——一个简单的抓包示例

  1. include <stdio.h>
  2. include <pcap.h>
  3. int main(int argc, char* argv[])
  4. {
  5. pcap_t* handle; /* Session handle */
  6. char* dev; /* The device to sniff on */
  7. char errbuf[PCAP_ERRBUF_SIZE]; /* Error string */
  8. struct bpf_program fp; /* The compiled filter */
  9. char filter_exp[] = "port 23"; /* The filter expression */
  10. bpf_u_int32 mask; /* Our netmask */
  11. bpf_u_int32 net; /* Our IP */
  12. struct pcap_pkthdr header; /* The header that pcap gives us */
  13. const u_char* packet; /* The actual packet */
  14. /* Define the device */
  15. dev = pcap_lookupdev(errbuf);
  16. if(dev == NULL)
  17. {
  18. fprintf(stderr, "Couldn't find default device: %s\n", errbuf);
  19. return 2;
  20. }
  21. /* Find the properties for the device */
  22. if(pcap_lookupnet(dev, &net, &mask, errbuf) == -1)
  23. {
  24. fprintf(stderr, "Couldn't get netmask for device %s: %s\n", dev, errbuf);
  25. net = 0;
  26. mask = 0;
  27. }
  28. /* Open the session in promiscuous mode */
  29. handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);
  30. if(handle == NULL)
  31. {
  32. fprintf(stderr, "Couldn't open device %s: %s\n", dev, errbuf);
  33. return 2;
  34. }
  35. /* Compile and apply the filter */
  36. if(pcap_compile(handle, &fp, filter_exp, 0, net) == -1)
  37. {
  38. fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle));
  39. return 2;
  40. }
  41. if(pcap_setfilter(handle, &fp) == -1)
  42. {
  43. fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle));
  44. return 2;
  45. }
  46. packet = pcap_next(handle, &header); /* Grab a packet */
  47. printf("Jacked a packet with length of [%d]\n", header.len);
  48. pcap_close(handle); /* Close the session */
  49. return 0;
  50. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
WinPcap

Home:http://www.winpcap.org/

Wikipedia:英文

它是 libpcap 在 Windows 系统下的移植。

8.2 传输层

socket

socket 最早源自 BSD 系统,有时候也称“伯克利套接字”。

它已成了传输层网络编程的标准,主流的操作系统平台都支持,主流的 C/C++ 编译器也都内置了相关的库文件。

ACE

Docs:http://www.dre.vanderbilt.edu/Doxygen/Stable/libace-doc/annotated.html

ACE 前面已经介绍过。它提供了针对 socket 的更高层封装。

APR

Docs:https://apr.apache.org/docs/apr/trunk/modules.html

APR 前面已经介绍过。它提供了对 socket 的封装和增强。

POCO::Net

Docs:http://pocoproject.org/docs/Poco.Net.html

POCO 前面已经介绍过。它提供了针对 TCP 服务端的封装类。

8.3 标准的应用层

8.3.1 综合性的库

cURL & libcurl

Home:http://curl.haxx.se/libcurl/

Wikipedia: 英文 中文

cURL 是一个功能很强的网络库/网络工具,支持 N 多应用层协议。下面是支持协议的列表(从它官网抄袭的)

DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMTP, SMTPS, Telnet and TFTP. curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, HTTP/2

它采用 C 语言开发,开发很活跃,支持非常多的操作系统平台。

关于 cURL,俺前几年写过一篇博文推荐它(在“[http://program-think.blogspot.com/2009/03/opensource-review-curl-library.html 这里]”)。

代码示例——IMAP 协议(邮件)

  1. include <stdio.h>
  2. include <curl/curl.h>
  3. int main()
  4. {
  5. curl_global_init(CURL_GLOBAL_ALL);
  6. CURL* curl = curl_easy_init();
  7. if(curl)
  8. {
  9. curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
  10. curl_easy_setopt(curl, CURLOPT_PASSWORD, "password");
  11. // This will list the folders within the user's mailbox. If you want to
  12. // list the folders within a specific folder, for example the inbox,
  13. // then specify the folder as a path in the URL such as /INBOX
  14. curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com");
  15. CURLcode res = curl_easy_perform(curl);
  16. if(res != CURLE_OK) // Check for errors
  17. {
  18. fprintf(stderr, "curl_easy_perform() failed: %s\n",
  19. curl_easy_strerror(res));
  20. }
  21. curl_easy_cleanup(curl); // Always cleanup
  22. }
  23. curl_global_cleanup();
  24. return 0;
  25. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
cURLpp

Home:http://www.curlpp.org/

看名字就知道这是 cURL 的 C++ 封装。

POCO::Net

Docs:http://pocoproject.org/docs/Poco.Net.html

POCO 前面已经介绍过。它提供了几种常见应用层协议(HTTP、SMTP、POP3、FTP、NTP …)的封装类。

8.3.2 HTTP

(关于“HTTP 协议”,请参见另一个大类:“Web 相关”)

8.3.3 DNS

c-ares

Home:http://c-ares.haxx.se/

这是一个 C 语言开发的 DNS 封装库,支持异步 DNS 请求,跨多种操作系统。

对比官网域名可知,它跟 cURL 是一家子。除了 cURL/libcurl 用到它,还有一些知名开源项目(比如:Wireshark、node.js …)用到它。

8.3.4 XMPP

 XMPP 的洋文全称是“Extensible Messaging and Presence Protocol”。这是一个标准化的 IM 交互协议)

Swiften

Home:http://swift.im/swiften.html

这是一个 C++ 语言开发的 XMPP 封装库。它同时也是 Swift 聊天客户端所用的后端。

它大量使用了 Boost 的子库(Signal、Bind、Optional、Smart Pointers …)。

QXmpp

Home:https://github.com/qxmpp-project/qxmpp

这是一个 C++ 语言开发的 XMPP 封装库。从它的名称可以看出——依赖了 Qt 框架(需要 Qt 4.5 或更高版本)。

8.4 自定义的应用层

Protocol Buffers

Home:https://developers.google.com/protocol-buffers/

Wikipedia: 英文

它是 Google 开发的一个跨语言的库,用于传输业务数据时的“编码/解码”。其优点是:跨多种语言、高性能、向前兼容、向后兼容。

具体的使用,可以参考俺前几年写过的一篇博文(在“ 这里”)。

作为 Protocol Buffers 的发明者,Google 默认实现了三种编程语言(C++、Java、Python)对它的支持。除了 Google 官方提供的这三种语言,它还支持很多其它的编程语言(由第三方提供)。

Apache Thrift

Home:https://thrift.apache.org/

Wikipedia: 英文

来自于 Apache 社区,提供了一种跨语言的通讯机制。

程序员通过 Thrift 的“接口定义语言”定义通讯协议格式,然后 Thrift 根据协议格式自动帮你生成服务端和客户端代码。

(在这个方面,它有点类似于 Google 的 Protocol Buffers)

8.5 网络库、框架、中间件

Boost.Asio

Docs:http://boost.org/libs/asio

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了异步网络通讯和异步 I/O。

代码示例——TCP Server

  1. include <string>
  2. include <iostream>
  3. include <boost/asio.hpp>
  4. int main()
  5. {
  6. using boost::asio::ip::tcp;
  7. try
  8. {
  9. boost::asio::io_service io_service;
  10. tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 13));
  11. while(true)
  12. {
  13. tcp::socket socket(io_service);
  14. acceptor.accept(socket);
  15. std::string msg = "Hello, world";
  16. boost::system::error_code ignored_err;
  17. boost::asio::write(socket, boost::asio::buffer(msg), ignored_err);
  18. }
  19. }
  20. catch(std::exception& err)
  21. {
  22. std::cerr << err.what() << std::endl;
  23. }
  24. return 0;
  25. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
ACE

Docs:http://www.dre.vanderbilt.edu/Doxygen/Stable/libace-doc/annotated.html

ACE 前面已经介绍过。它提供了很多种用于网络通讯的设计模式。

ZeroMQ(ØMQ)

Home:http://www.zeromq.org/

Wikipedia: 英文 中文

ZeroMQ 是一个轻量级、跨平台的开源库,提供了高性能、异步的消息队列。采用 C++ 开发,提供了多种语言的绑定。

与传统的消息中间件不同,使用 ZeroMQ 不需要额外的“消息代理(message broker)”。

俺曾经写过一篇博文推荐它(在“ 这里”)。

代码示例——TCP Server

  1. include <zhelpers.hpp>
  2. int main(int argc, char* argv[])
  3. {
  4. zmq::context_t context(1);
  5. zmq::socket_t responder(context, ZMQ_REP);
  6. responder.connect("tcp://localhost:5560");
  7. while(true)
  8. {
  9. // Wait for next request from client
  10. std::string request = s_recv(responder);
  11. std::cout << "Received request: " << request << std::endl;
  12. // Do some 'work'
  13. sleep(1);
  14. // Send reply back to client
  15. s_send(responder, "Hello, world");
  16. }
  17. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
nanomsg

Home:http://nanomsg.org/

很类似 ZeroMQ 的库,比 ZMQ 更加轻量级。采用 C 开发,提供了多种语言的绑定。

API 完全参照 BSD socket 的风格和语义。

代码示例——Request/Reply

  1. include <assert.h>
  2. include <libc.h>
  3. include <stdio.h>
  4. include <nanomsg/nn.h>
  5. include <nanomsg/pipeline.h>
  6. int reply(const char* url)
  7. {
  8. int sock = nn_socket(AF_SP, NN_PULL);
  9. assert(sock >= 0);
  10. assert(nn_bind(sock, url) >= 0);
  11. while(1)
  12. {
  13. char* msg = NULL;
  14. int bytes = nn_recv(sock, &msg, NN_MSG, 0);
  15. assert(bytes >= 0);
  16. printf("RECEIVED:\n%s\n", msg);
  17. nn_freemsg(msg);
  18. }
  19. }
  20. int request(const char* url, const char* msg)
  21. {
  22. int sz_msg = strlen(msg) + 1; // '\0'
  23. int sock = nn_socket(AF_SP, NN_PUSH);
  24. assert(sock >= 0);
  25. assert(nn_connect(sock, url) >= 0);
  26. printf("SENDING:\n%s\n", msg);
  27. int bytes = nn_send(sock, msg, sz_msg, 0);
  28. assert(bytes == sz_msg);
  29. return nn_shutdown(sock, 0);
  30. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
ICE(Internet Communications Engine)

Home:https://zeroc.com/

Wikipedia: 英文中文

这是一个面向对象的通讯中间件,诞生于2002年。支持不同编程语言的通讯。

它的设计借鉴了 CORBA,好在没有 CORBA 那么复杂。

libevent

Home:http://libevent.org/

Wikipedia:英文 中文

它提供了异步事件处理机制。在网络开发中,可以用它替代传统的“event loop”,有助于简化代码。

它被一些知名的开源项目使用(比如: Tormemcached)。

代码示例——HTTP Server(本示例基于 ANSI C)

  1. include <sys/types.h>
  2. include <stdio.h>
  3. include <stdlib.h>
  4. include <unistd.h>
  5. include <event.h>
  6. include <evhttp.h>
  7. void generic_request_handler(struct evhttp_request* req, void* arg)
  8. {
  9. struct evbuffer* return_buffer = evbuffer_new();
  10. evbuffer_add_printf(return_buffer, "Thanks for the request!");
  11. evhttp_send_reply(req, HTTP_OK, "Client", return_buffer);
  12. evbuffer_free(return_buffer);
  13. }
  14. int main(int argc, char** argv)
  15. {
  16. short http_port = 8080;
  17. char* http_addr = "127.0.0.1";
  18. struct evhttp* http_server = NULL;
  19. event_init();
  20. http_server = evhttp_start(http_addr, http_port);
  21. evhttp_set_gencb(http_server, generic_request_handler, NULL);
  22. fprintf(stderr, "Server started on port %d\n", http_port);
  23. event_dispatch();
  24. return 0;
  25. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

代码示例——HTTP Server(本示例基于 C++ 11 标准)

  1. include <memory>
  2. include <cstdint>
  3. include <iostream>
  4. include <evhttp.h>
  5. int main()
  6. {
  7. if(!event_init())
  8. {
  9. std::cerr << "Failed to init libevent." << std::endl;
  10. return -1;
  11. }
  12. char const SrvAddress[] = "127.0.0.1";
  13. std::uint16_t SrvPort = 8080;
  14. std::unique_ptr<evhttp, decltype(&evhttp_free)> Server(evhttp_start(SrvAddress, SrvPort), &evhttp_free);
  15. if(!Server)
  16. {
  17. std::cerr << "Failed to init http server." << std::endl;
  18. return -1;
  19. }
  20. void (*OnReq)(evhttp_request* req, void*) = [] (evhttp_request* req, void*)
  21. {
  22. auto* OutBuf = evhttp_request_get_output_buffer(req);
  23. if(!OutBuf)
  24. {
  25. return;
  26. }
  27. evbuffer_add_printf(OutBuf, "<html><body><h1>Hello, World!</h1></body></html>");
  28. evhttp_send_reply(req, HTTP_OK, "", OutBuf);
  29. };
  30. evhttp_set_gencb(Server.get(), OnReq, nullptr);
  31. if(event_dispatch() == -1)
  32. {
  33. std::cerr << "Failed to run messahe loop." << std::endl;
  34. return -1;
  35. }
  36. return 0;
  37. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
libev

Home:http://libev.schmorp.de/

看名称就能猜到它跟 libevent 很像。实际上,你可以把 libev 视为 libevent 的竞争性替代品。

gevent 官方博客的 一篇文章对比了这俩库的优缺点。

libuv

Home:https://github.com/libuv/libuv

Wikipedia: 英文

它提供了跨平台的异步 I/O 机制。主要是为了提供给 Node.js 使用。

除了支持网络通讯,还支持:线程池、Windows 命名管道、Unix domain sockets、文件系统事件通知 ……

Dlib

Docs:http://dlib.net/network.html

Dlib 前面已经介绍过。它针对网络通讯,提供了比较高的抽象层。


9 数据库

9.1 开源数据库

MySQL

Home:https://www.mysql.com/

Wikipedia:英文中文

名气最大的开源数据库,诞生于1995年,采用 C 和 C++ 语言开发。如今隶属于 Oracle 公司。

PostgreSQL

Home:http://postgresql.org/

Wikipedia:英文 中文

名气仅次于 MySQL 的开源数据库,诞生于1996年。采用 C 语言开发。

SQLite

Home:http://sqlite.org/

Wikipedia: 英文中文

它是一个很优秀的嵌入式(进程内)数据库,非常轻量级,支持各种作系统平台。采用 C 语言开发。

俺前几年写过一篇博文推荐它(在“这里”)。

MongoDB

Home:https://www.mongodb.org/

Wikipedia:英文

这是近几年兴起的 NoSQL 数据库的一员。它本身是基于 C++ 和 C 开发的。

Redis

Home:[http://redis.io/]

Wikipedia: 中文英文

诞生于2009年,是目前(2014~2015)最流行的键值存储数据库,基于 C 语言开发。

以性能高而著称,很多大型网站用到它(Twitter、GitHub、Flickr、Instagram、百度、新浪、腾讯、搜狐)

Berkeley DB(BDB)

Home:http://www.oracle.com/us/products/database/berkeley-db/

Wikipedia: 英文中文

诞生于1994年,是一个很老牌的嵌入式(进程内)数据库,提供“键值存储”的功能,基于 C 语言开发。

开发 BDB 的公司于2006年被 Oracle 收购。

很多开源项目用到它。甚至 MySQL 也包含了一个基于 BDB 的存储后端。

LevelDB

Home:https://github.com/google/leveldb

Wikipedia:英文中文

它是 Google 基于 C++ 开发的 NoSQL 数据库,提供“键值存储”的功能。

号称速度很快,内置数据压缩(基于 Snappy 库)。

比特币项目用到它。Facebook 基于它开发出 RocksDB 数据库。

Firebird

Home:http://www.firebirdsql.org/

Wikipedia: 英文 中文

它是2000年的时候,从 Borland 公司的 InterBase 数据库派生出来的。

基于 C++ 开发,支持多种操作系统平台。

关于它有个插曲:Firefox 浏览器曾经用过“Firebird”这个名称,因为跟 Firebird 数据库同名,后来才改用 Firefox 这个名称。

ScyllaDB

Home:http://www.scylladb.com/

这是2015年新兴的 NoSQL 数据库,相当于是用 C++ 重写了(Java 开发的)Cassandra。

号称性能提高10倍,并且延迟极低。

9.2 数据库 API 的封装库

9.2.1 综合性的封装库

OTL

Home:http://otl.sourceforge.net/

Wikipedia:英文

原生支持的数据库:Oracle、SQL Server、DB2、Informix、TimesTen, MAX/DB;另支持 ODBC。

它的特色是:全部代码都在一个头文件中。

代码示例——操作 Oracle 数据库

  1. include <stdio.h>
  2. include <iostream>
  3. define OTL_ORA8 // Compile OTL 4.0/OCI8
  4. include <otlv4.h> // include the OTL 4.0 header file
  5. int main()
  6. {
  7. otl_connect::otl_initialize();
  8. try
  9. {
  10. otl_connect db;
  11. db.rlogon("scott/tiger"); // connect to Oracle
  12. otl_cursor::direct_exec(
  13. db,
  14. "drop table test_tab",
  15. otl_exception::disabled // disable OTL exceptions
  16. );
  17. otl_cursor::direct_exec(
  18. db,
  19. "create table test_tab(f1 number, f2 varchar2(30))"
  20. );
  21. }
  22. catch(otl_exception& err)
  23. {
  24. using namespace std;
  25. // intercept OTL exceptions
  26. cerr << err.msg << endl; // print error message
  27. cerr << err.stm_text << endl; // print SQL that caused the error
  28. cerr << err.var_info << endl; // print variable that caused the error
  29. }
  30. db.logoff(); // disconnect from Oracle
  31. return 0;
  32. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

9.2.2 MySQL 封装库

MySQL Connector C++

Home:http://dev.mysql.com/doc/connector-cpp/en/

这是 MySQL 官方提供的 C++ 封装。

代码示例——执行 SQL 语句

  1. sql::mysql::MySQL_Driver* driver = sql::mysql::MySQL_Driver::get_mysql_driver_instance();
  2. sql::Connection* conn = driver->connect("tcp://127.0.0.1:3306", "user", "password");
  3. sql::Statement* stmt = conn->createStatement();
  4. stmt->execute("USE EXAMPLE_DB");
  5. stmt->execute("DROP TABLE IF EXISTS test");
  6. stmt->execute("CREATE TABLE test(id INT, label CHAR(1))");
  7. stmt->execute("INSERT INTO test(id, label) VALUES (1, 'a')");
  8. delete stmt;
  9. stmt = NULL;
  10. delete conn;
  11. conn = NULL;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
MySQL++

Home:http://www.tangentsoft.net/mysql%2B%2B/

这是个老牌的库,诞生于1998年,提供了 MySQL API 的 C++ 封装。

代码示例——执行 SQL 语句

  1. include <iostream>
  2. include <mysql++.h>
  3. void query(db_name, server_name, user, password)
  4. {
  5. using namespace std;
  6. mysqlpp::Connection conn(false);
  7. if(!conn.connect(db_name, server_name, user, password))
  8. {
  9. cerr << "DB connection failed: " << conn.error() << endl;
  10. return;
  11. }
  12. mysqlpp::Query query = conn.query("select item from table1");
  13. mysqlpp::StoreQueryResult sqr = query.store()
  14. if(!sqr)
  15. {
  16. cerr << "Failed to get item list: " << query.error() << endl;
  17. return;
  18. }
  19. mysqlpp::StoreQueryResult::const_iterator iter;
  20. for(iter=sqr.begin(); iter!=sqr.end(); ++iter)
  21. {
  22. mysqlpp::Row row = *iter;
  23. cout << '\t' << row[0] << endl;
  24. }
  25. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
POCO::Data::MySQL

Docs:http://pocoproject.org/docs/package-MySQL.MySQL.html

POCO 前面已经介绍过。它提供了 MySQL 的封装类

9.2.3 PostgreSQL 封装库

libpq

Home:http://www.postgresql.org/docs/9.4/static/libpq.html

这是由 PostgreSQL 官方提供的 C 封装类库。

libpqxx

Home:http://pqxx.org/development/libpqxx/

这是由 PostgreSQL 官方提供的 C++ 封装类库。

代码示例

  1. include <iostream>
  2. include <pqxx/pqxx>
  3. void update(const std::string& name)
  4. {
  5. pqxx::connection conn("dbname=company user=accounting");
  6. pqxx::work txn(conn);
  7. pqxx::result r = txn.exec("SELECT id FROM Employee WHERE name =" + name);
  8. if(r.size() != 1)
  9. {
  10. std::cerr << "Expected 1 employee with name " << name << ", "
  11. << "but found " << r.size() << std::endl;
  12. return 1;
  13. }
  14. int employee_id = r[0][0].as<int>();
  15. std::cout << "Updating employee " << employee_id << std::endl;
  16. txn.exec(
  17. "UPDATE EMPLOYEE SET salary = salary + 1 "
  18. "WHERE id = " + txn.quote(employee_id)
  19. );
  20. txn.commit();
  21. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

9.2.4 Oracle 封装库

OCILIB

Home:http://vrogier.github.io/ocilib/

这是一个跨平台的 C 开源库。如其名,它封装了 Oracle 官方的 OCI(Oracle Call Interface)。

它同时还提供了 C++ 的 API。

代码示例

  1. include <ocilib.hpp>
  2. using namespace ocilib;
  3. int main()
  4. {
  5. try
  6. {
  7. Environment::Initialize();
  8. Connection conn("db", "user", "password");
  9. Statement stmt(conn);
  10. stmt.Execute("select intcol, strcol from table");
  11. Resultset rs = stmt.GetResultset();
  12. while(rs.Next())
  13. {
  14. std::cout << rs.Get<int>(1) << " - " << rs.Get<ostring>(2) << std::endl;
  15. }
  16. }
  17. catch(std::exception& err)
  18. {
  19. std::cout << err.what() << std::endl;
  20. }
  21. Environment::Cleanup();
  22. return 0;
  23. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

9.2.5 DB2 封装库

9.2.6 SQLite 封装库

官方的 C API

Docs:http://sqlite.org/c3ref/intro.html

SQLite 前面已经介绍过。由于 SQLite 本身就是用 C 语言开发的,因此它直接提供了基于 C 的 API 接口。

代码示例

  1. include <stdio.h>
  2. include <sqlite3.h>
  3. static int callback(void* NotUsed, int argc, char** argv, char** azColName)
  4. {
  5. for(int i=0; i<argc; i++)
  6. {
  7. printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  8. }
  9. printf("\n");
  10. return 0;
  11. }
  12. int main(int argc, char* argv[])
  13. {
  14. if(argc != 3)
  15. {
  16. fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
  17. return 1;
  18. }
  19. sqlite3* db = NULL;
  20. int rc = sqlite3_open(argv[1], &db);
  21. if(rc)
  22. {
  23. fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
  24. sqlite3_close(db);
  25. return 1;
  26. }
  27. char* szErrMsg = NULL;
  28. rc = sqlite3_exec(db, argv[2], callback, 0, &szErrMsg);
  29. if(rc != SQLITE_OK)
  30. {
  31. fprintf(stderr, "SQL error: %s\n", szErrMsg);
  32. sqlite3_free(szErrMsg);
  33. }
  34. sqlite3_close(db);
  35. return 0;
  36. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
POCO::Data::SQLite

Docs:[http://pocoproject.org/docs/package-SQLite.SQLite.html]

POCO 前面已经介绍过。它提供了 sqlite 的封装类

9.2.7 Redis 封装库

Hiredis

Home:https://github.com/redis/hiredis

这是 Redis 官方提供的 C 客户端,很轻量级,支持“异步 API”。

代码示例——结合 libev 进行异步调用

  1. include <stdio.h>
  2. include <stdlib.h>
  3. include <string.h>
  4. include <signal.h>
  5. include <hiredis.h>
  6. include <async.h>
  7. include <adapters/libev.h>
  8. void getCallback(redisAsyncContext* context, void* r, void* privdata)
  9. {
  10. redisReply* reply = r;
  11. if(reply == NULL)
  12. {
  13. return;
  14. }
  15. printf("argv[%s]: %s\n", (char*)privdata, reply->str);
  16. redisAsyncDisconnect(context); /* Disconnect after receiv reply */
  17. }
  18. void connectCallback(const redisAsyncContext* context, int status)
  19. {
  20. if(status != REDIS_OK)
  21. {
  22. printf("Error: %s\n", context->errstr);
  23. return;
  24. }
  25. printf("Connected...\n");
  26. }
  27. void disconnectCallback(const redisAsyncContext* context, int status)
  28. {
  29. if(status != REDIS_OK)
  30. {
  31. printf("Error: %s\n", context->errstr);
  32. return;
  33. }
  34. printf("Disconnected...\n");
  35. }
  36. int main(int argc, char* argv[])
  37. {
  38. signal(SIGPIPE, SIG_IGN);
  39. redisAsyncContext* context = redisAsyncConnect("127.0.0.1", 6379);
  40. if(context->err)
  41. {
  42. printf("Error: %s\n", context->errstr);
  43. return 1; /* Let *context leak for now... */
  44. }
  45. redisLibevAttach(EV_DEFAULT_ context);
  46. redisAsyncSetConnectCallback(context, connectCallback);
  47. redisAsyncSetDisconnectCallback(context, disconnectCallback);
  48. redisAsyncCommand(context, NULL, NULL,
  49. "SET key %b", argv[argc-1], strlen(argv[argc-1]));
  50. redisAsyncCommand(context, getCallback, (char*)"end-1", "GET key");
  51. ev_loop(EV_DEFAULT_ 0);
  52. return 0;
  53. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

9.2.8 MongoDB 封装库

官方的 C API

Docs:https://api.mongodb.org/c/current/

MongoDB 前面已经介绍过。这是其官方提供的 API。

代码示例

  1. include <stdio.h>
  2. include <bson.h>
  3. include <mongoc.h>
  4. int main(int argc, char* argv[])
  5. {
  6. mongoc_init();
  7. mongoc_client_t* client = mongoc_client_new("mongodb://localhost:27017/");
  8. mongoc_collection_t* collection = mongoc_client_get_collection(client, "test", "test");
  9. bson_t* doc = bson_new();
  10. bson_oid_t oid;
  11. bson_oid_init(&oid, NULL);
  12. BSON_APPEND_OID(doc, "_id", &oid);
  13. BSON_APPEND_UTF8(doc, "hello", "world");
  14. bson_error_t error;
  15. if(!mongoc_collection_insert(collection, MONGOC_INSERT_NONE, doc, NULL, &error))
  16. {
  17. printf("%s\n", error.message);
  18. }
  19. bson_destroy(doc);
  20. mongoc_collection_destroy(collection);
  21. mongoc_client_destroy(client);
  22. return 0;
  23. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
POCO::MongoDB

Docs:http://pocoproject.org/docs/package-MongoDB.MongoDB.html

POCO 前面已经介绍过。它提供了 MongoDB 的封装类

9.3 ODBC 相关

unixODBC

Home:http://www.unixodbc.org/

Wikipedia: 英文

诞生于1999年,实现了全套的 ODBC 架构,包括:驱动管理器、相关的 GUI 界面和命令行界面。支持多种操作系统。

Libodbc++

Home:http://libodbcxx.sourceforge.net/

如其名,这是专门封装 ODBC 的 C++ 类库,支持多种操作系统。它提供的 API 类似于 JDBC 的 API

POCO::Data::ODBC

Docs:http://pocoproject.org/docs/package-ODBC.ODBC.html

POCO 前面已经介绍过。它提供了操作 ODBC 的封装类。

9.4 ORM(Object-Relational Mapping)

ODB

Home:http://www.codesynthesis.com/products/odb

Wikipedia: 英文

它的特色是:可以根据 C++ 类定义自动生成数据库的表结构。

为了获得高性能,它直接调用具体数据库的原生 API。支持的数据库包括:MySQL、PostgreSQL、Oracle、SQL Server、SQLite

代码示例——声明一个可持久化的类

  1. // 通过预处理语句“pragma”来进行某些定制
  2. pragma db object table("people")
  3. class person
  4. {
  5. public:
  6. // ......
  7. private:
  8. friend class odb::access;
  9. person();
  10. pragma db id auto
  11. unsigned long id_;
  12. string first_;
  13. string last_;
  14. pragma type("INT UNSIGNED")
  15. unsigned short age_;
  16. };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

代码示例——查询

  1. typedef odb::query<person> query;
  2. typedef odb::result<person> result;
  3. transaction trans(db.begin());
  4. result r(db.query<person>(query::last == "Doe" && query::age < 30));
  5. for(result::iterator i(r.begin()); i!=r.end(); ++i)
  6. {
  7. cout << "Hello, " << i->first() << endl;
  8. }
  9. trans.commit();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
hiberlite

Home:https://github.com/paulftw/hiberlite

专门提供给 Sqlite 的 ORM 封装库。基于 C++ 开发,其 API 采用类似 Boost.Serialization 的风格。


10 Web

10.1 HTTP Server

Apache HTTP Server

Home:https://httpd.apache.org/

Wikipedia: 英文 中文

大名鼎鼎的 Apache,诞生于1995年,采用 C 和 C++ 开发。长期作为 Web Server 市场份额的老大。

Nginx

Home:http://nginx.org/

Wikipedia: 英文 中文

Web Server 的后起之秀,诞生于2002年,采用 C 语言开发。其市场份额如今排名第二。

POCO::Net

Docs:http://pocoproject.org/docs/package-Net.HTTPServer.html

POCO 前面已经介绍过。它提供了 HTTP Server 的封装类

Dlib::server_http

Docs:http://dlib.net/network.html#server_http

Dlib 前面已经介绍过。它提供了一个简单的 HTTP Server 的类(server_http)。

10.2 HTTP Client

cURL & libcurl

Docs:http://curl.haxx.se/libcurl/c/

libcurl 前面已经介绍过。它提供了【完整的】HTTP 协议支持。另,HTTP 2.0 标准刚出来不久,它就已经支持了。

代码示例——HTTP POST

  1. include <stdio.h>
  2. include <curl/curl.h>
  3. int main()
  4. {
  5. curl_global_init(CURL_GLOBAL_ALL);
  6. CURL* curl = curl_easy_init();
  7. if(curl)
  8. {
  9. curl_easy_setopt(curl, CURLOPT_URL, "http://post.example.com/foo.cgi");
  10. curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl");
  11. CURLcode res = curl_easy_perform(curl);
  12. if(res != CURLE_OK) // Check for errors
  13. {
  14. fprintf(stderr, "curl_easy_perform() failed: %s\n",
  15. curl_easy_strerror(res));
  16. }
  17. curl_easy_cleanup(curl); // always cleanup
  18. }
  19. curl_global_cleanup();
  20. return 0;
  21. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
POCO::Net

Docs:http://pocoproject.org/docs/package-Net.HTTPClient.html

POCO 前面已经介绍过。它提供了 HTTP Client 的封装类。

10.3 浏览器引擎

WebKit

Home:https://www.webkit.org/

Wikipedia:英文 中文

它是很多浏览器使用的渲染引擎,基于 C++ 开发。

Gecko

Home:https://developer.mozilla.org/

Wikipedia:英文 中文

它是 Firefox 的渲染引擎,基于 C++ 开发,由 Mozilla 社区维护。

10.4 浏览器整合

CEF(Chromium Embedded Framework)

Home:https://bitbucket.org/chromiumembedded/cef

Wikipedia: 英文

如其名,它提供了嵌入 Chrome 浏览器的框架。采用 C++ 开发。好几个商业公司(Google、Adobe、Facebook、Evernote…)的产品用到它。

以下是其它开源项目针对 CEF 的扩展,提供了其它编程语言的绑定。

PhantomJS

Home:http://phantomjs.org/

Wikipedia:英文

2011年才诞生的。基于 C++ 开发,整合了 WebKit。

它本身没有提供 GUI 界面。但是提供了 JavaScript 的 API,让你可以操纵 WebKit 引擎。可以利用它进行 Web 界面的单元测试。

10.5 (其它)

WebSocket++

Home:http://www.zaphoyd.com/websocketpp/

顾名思义,它提供了 WebSocket 的 C++ 封装,基于 Boost Asio 构建。

支持多种操作系统平台,支持 TLS、proxy、IPv6。


11 信息安全

11.1 密码学

Crypto++

Docs:http://www.cryptopp.com/docs/ref/annotated.html

Crypto++ 前面已经介绍过。它提供了常见的对称加密算法(DES、AES、IDEA 等)、公钥加密算法(RSA、DSA 等)、散列算法(MD5、SHA1、RIPEMD 等)。

代码示例——计算 SHA256 散列值

  1. include <cryptopp/sha.h>
  2. using namespace CryptoPP;
  3. const byte* pbData = ...; // 要计算的数据的地址
  4. unsigned int nDataLen = ...; // 字节数
  5. byte abDigest[SHA256::DIGESTSIZE];
  6. SHA256().CalculateDigest(abDigest, pbData, nDataLen);
  7. // 注:abDigest 中通常会包含不可见字符,要输出为可见字符串需要做一下 Hex 编码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
OpenSSL

Home:https://www.openssl.org/

Wikipedia: 英文中文

OpenSSL 基于 C 语言开发,在加密领域那可是大名鼎鼎。大部分常用的加密算法(对称、非对称)和散列算法,它都支持。

很多知名的软件(包括 Web Server)用到它,所以2014年的“心脏滴血漏洞”让好多网站中招。

LibreSSL

Home:http://www.libressl.org/

Wikipedia: 英文中文

OpenSSL 爆出“心脏滴血漏洞”之后,OpenBSD 社区的程序员复制了 OpenSSL 版本 1.0.1g 的代码,然后另起炉灶。

LibreSSL 的主要目标是“安全性”,其维护人员删除了原 OpenSSL 中大量过时的代码,替换了相关的内存管理函数(规避缓冲区溢出),增强了随机数生成算法….

GnuTLS

Home:http://gnutls.org/

Wikipedia: 英文

采用 C 语言开发,名气也挺大。如其名,主要提供 TLS/SSL 的相关功能。

NaCl

Home:http://nacl.cr.yp.to/

Wikipedia: 英文

这个名称是“Networking and Cryptography library”的缩写。

它采用 C 语言开发,另有其它编程语言(Python、Ruby、PHP)的 API 绑定。

它的作者同时也是 qmail 和 Curve25519 的作者。

libsodium

Home:https://github.com/jedisct1/libsodium

它派生自 NaCl,提供了跟 NaCl 兼容的 API。支持的操作系统平台更多。

shadowsocks 和 dnscrypt-proxy 用到它。

Keyczar

Home:https://github.com/google/keyczar

这是 Google 提供的加密库,同时提供 C++、Java、Python 三种语言的实现。

它提供了比较高层的 API, 使用者无需关心太多的细节。

代码示例——加密/解密文本

  1. include <cassert>
  2. include <iostream>
  3. include <string>
  4. include <keyczar/keyczar.h>
  5. void test(const std::string& key_location)
  6. {
  7. keyczar::Keyczar* crypter = keyczar::Crypter::Read(key_location);
  8. if(!crypter)
  9. {
  10. return;
  11. }
  12. std::string plain = "Secret message";
  13. std::cout << "Plain text: " << plain << std::endl;
  14. std::string cipher;
  15. if(crypter->Encrypt(plain, &cipher))
  16. {
  17. std::cout << "Cipher text (Base64w): " << cipher << std::endl;
  18. std::string decrypted;
  19. if(crypter->Decrypt(cipher, &decrypted))
  20. {
  21. assert(plain == decrypted);
  22. }
  23. }
  24. delete crypter;
  25. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
POCO::Crypto

Docs:http://pocoproject.org/docs/Poco.Crypto.html

POCO 前面已经介绍过。它提供了常见的加密算法和哈希算法。


12 处理文件格式

12.1 结构化数据格式

12.1.1 CSV

CSV 是一种历史悠久的结构化数据存储格式。其效果类似于一张数据库二维表。

Boost.Tokenizer

Docs:http://boost.org/libs/tokenizer

Boost 前面已经介绍过。这是 Boost 的其中一个子库,用来灵活地切割字符串。使用它,可以帮你提取 CSV 的行和列。

12.1.2 JSON

JSON 格式源自 JavaScript,如今在 Web 开发中广为应用。

Boost.PropertyTree

Docs:http://boost.org/libs/property_tree

Boost 前面已经介绍过。这是 Boost 的其中一个子库,封装了某种特殊的“树”结构(property_tree)。它支持对 JSON 的读写。

代码示例——读写 JSON 字符串

  1. include <sstream>
  2. include <boost/property_tree/ptree.hpp>
  3. include <boost/property_tree/json_parser.hpp>
  4. using boost::property_tree::ptree;
  5. using boost::property_tree::read_json;
  6. using boost::property_tree::write_json;
  7. // Write json
  8. ptree pt1;
  9. pt1.put("foo", "bar");
  10. std::ostringstream oss;
  11. write_json(oss, pt1, false);
  12. std::string json = oss.str(); // {"foo":"bar"}
  13. // Read json
  14. std::istringstream iss(json);
  15. ptree pt2;
  16. read_json(iss, pt2);
  17. std::string value = pt2.get<std::string>("foo");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
POCO::JSON

Docs:http://pocoproject.org/docs/package-JSON.JSON.html

POCO 前面已经介绍过。它提供了 JSON 的封装类

rapidjson

Home:https://github.com/miloyip/rapidjson

这是一个 C++ 的 JSON 库。提供了 SAX 和 DOM 风格的 API。

(另,作者是香港同胞)

jsoncpp

Home:https://github.com/open-source-parsers/jsoncpp

如其名,这是个 C++ 的 JSON 封装库。

12.1.3 YAML

YAML 是一种类似于 json 的结构化数据格式。它在确保可读性的基础上,提供了超越 json 的灵活性和扩展性。

yaml-cpp

Home:https://github.com/jbeder/yaml-cpp

C++ 实现的 YAML 解析器。

LibYAML

Home:http://pyyaml.org/wiki/LibYAML

C 语言实现的 YAML 解析器。

12.2 压缩文件 & 打包文件

12.2.1 综合性的库

libarchive

Home:http://www.libarchive.org/

C 语言实现,支持的格式:

可读写的格式:zip、gzip、bzip2、xz、lzma、tar、ISO、cpio、ar、pax、mtree;

只读的格式:7z、rar、cab、rpm、lzh、lzop、raw、xar

LZMA SDK

Home:http://www.7-zip.org/sdk.html

这是由 7-zip 官方提供的。7-zip 就是用它进行压缩/解压缩。

支持的格式:7z、LZMA、LZMA2、XZ

PhysicsFS

Home:http://icculus.org/physfs/

Wikipedia: 英文

针对不同的压缩/归档格式,提供了类似 VFS 的抽象封装层。主要用于游戏开发中。

支持的格式:zip、7z、GRP、PAK、HOG、MVL、WAD…

zopfli

Home:https://github.com/google/zopfli

这是由 Google 开发的 C 库,提供对 zip 和 gzip 格式的压缩(不提供解压)。

压缩的速度比较慢,但是可以得到更高的压缩率。

12.2.2 zip

格式说明

libzip

Home:http://www.nih.at/libzip/

Wikipedia:英文

用 C 语言开发的库,基于 zlib 库。

Poco::Zip

Docs:http://pocoproject.org/docs/Poco.Zip.html

POCO 前面已经介绍过。它提供了若干封装类,用于 zip 格式的压缩和解压。

12.2.3 bzip2(bz2)

格式说明

libbzip2

Home:http://bzip.org/

这是 bzip2 官方提供的库,C 语言实现。

12.2.4 gzip(gz)

zlib

Home:http://zlib.net/

Wikipedia: 英文 中文

C 语言实现,诞生于1995年,被大量的开源项目使用(OpenSSL、OpenSSH、Apache、PostgreSQL、Git、libpng……)。

12.2.5 tar

libtar

Home:http://www.feep.net/libtar/

基于 C 语言开发,可以对 tar 格式添加内容或读取内容。

12.2.6 rar

unrarlib

Home:http://www.unrarlib.org/

该项目的开发已经停止。只支持对 RAR2 格式的解压缩。

12.2.7 snappy

snappy

Home:https://google.github.io/snappy/

由 Google 开发的压缩格式,特点是非常快(不论是压缩还是解压);但是压缩率不如 gzip。

起先被用于 Google 内部的 BigTable,如今被用于多种 NoSQL 数据库(比如:Cassandra、Hadoop、LevelDB、MongoDB、RocksDB…)

支持多种语言的绑定(C#、Common Lisp、Erlang、Go、Haskell、Lua、Java、Node.js、Perl、PHP、Python、R、Ruby、Smalltalk)

12.2.8 Brotli

Brotli

Home:https://github.com/google/brotli

Wikipedia: 英文

由 Google 开发的压缩格式,压缩率很高(据说高于 LZMA 和 bz2)。

该算法很新,是2015年9月才发布的。

12.3 标记语言

12.3.1 XML

Expat

Home:http://www.libexpat.org/

Wikipedia:英文

基于 C 语言实现,诞生于1998年。很多知名的开源项目(Apache Server、Firefox、Python、PHP、Perl)用到它。

libxml2

Home:http://xmlsoft.org/

Wikipedia:英文

基于 C 语言实现,诞生于1999年。提供了多种语言(C++、Python、Ruby、Common Lisp、PHP、Perl)的 API 绑定。

wxWidgets

Docs:wxWidgets

wxWidgets 前面已经介绍过。它提供了 XML 的封装类,其内部是基于 Expat 进行解析。

POCO::XML

Docs:XML

POCO 前面已经介绍过。它提供了 XML 的封装类。

libxml++

Home:libxml++

如其名,它是针对前面提到的 libxml2 的 C++ 封装。

12.3.2 HTML

htmlcxx

Home:http://htmlcxx.sourceforge.net/

如其名,是基于 C++ 开发的。支持 HTML 和 CSS 的解析。

12.4 PDF

PoDoFo

Home:http://podofo.sourceforge.net/

基于 C++ 开发的跨平台库,名称取自“Portable Document Format”每个单词的头两个字母 :)

它既支持 PDF 文件的生成,也支持 PDF 内容的提取。它同时还提供一堆命令行的小工具,用来操作 PDF 文件。

LibHaru

Home:http://libharu.org/

Wikipedia:英文

它是基于 C 语言开发的跨平台库,可以用来生成 PDF 文件格式。

代码示例

  1. include <hpdf.h>
  2. // 创建文档对象
  3. HPDF_Doc doc = HPDF_New(error_handler, NULL);
  4. if(!doc)
  5. {
  6. printf("ERROR: cannot create pdf object.\n");
  7. return 1;
  8. }
  9. // 设置文档属性
  10. HPDF_SetCompressionMode(doc, HPDF_COMP_ALL);
  11. HPDF_SetPageMode(doc, HPDF_PAGE_MODE_USE_OUTLINE);
  12. HPDF_SetPassword(doc, "owner pwd", "user pwd");
  13. // 添加一页
  14. HPDF_Page page_1 = HPDF_AddPage(doc);
  15. // 设置页属性
  16. HPDF_Page_SetSize(page_1, HPDF_PAGE_SIZE_B5, HPDF_PAGE_LANDSCAPE);
  17. // 保存到文件
  18. HPDF_SaveToFile(doc, "test.pdf");
  19. // 结束
  20. HPDF_Free(doc);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

12.5 MS Office 文档

wvWare

Home:http://wvware.sourceforge.net/

它能够读取 Word 文档的内容,支持的 Word 版本是(2000、97、95、6)。

AbiWord 和 KWord 用到它。

12.6 RTF

LibRTF

Home:http://sourceforge.net/projects/librtf/

C 语言实现的库,可以解析 RTF 文件格式。

12.7 CHM

CHMLIB

Home:CHMLIB

这是一个轻量级的库,基于 C 语言开发,可以用来提取 CHM 格式文件的内容。

它提供了多种编程语言(C++、Python、Perl、Common Lisp)的 API 绑定。

libCHMxx

Home:libCHMxx

它就是基于 CHMLIB 的 C++ 封装库。


13 图像

13.1 图像处理

ImageMagick

Home:http://imagemagick.org/

Wikipedia: 英文 中文

ImageMagick 可说是最强大的开源图片处理工具集,采用 C 语言编写。诞生于1990年,其开发至今依然非常活跃。支持非常多的操作系统平台。

它提供许多编程语言的 API,对于 C++ 是 Magick++,对于 C 是 MagickWand

Boost.GIL(Generic Image Library)

Docs:http://boost.org/libs/gil

Boost 前面已经介绍过。这是 Boost 的其中一个子库,实现了图像处理功能。

代码示例——调整图像尺寸

  1. include <boost/gil/image.hpp>
  2. include <boost/gil/typedefs.hpp>
  3. include <boost/gil/extension/io/jpeg_io.hpp>
  4. include <boost/gil/extension/numeric/sampler.hpp>
  5. include <boost/gil/extension/numeric/resample.hpp>
  6. using namespace boost::gil;
  7. rgb8_image_t img;
  8. jpeg_read_image("input.jpg", img);
  9. // Scale the image to 100x100 pixels using bilinear resampling
  10. rgb8_image_t square(100, 100);
  11. resize_view(const_view(img), view(square), bilinear_sampler());
  12. jpeg_write_view("output.jpg", const_view(square));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
Dlib

Docs:http://dlib.net/imaging.html

Dlib 前面已经介绍过。它提供了常见的图像处理功能(旋转、剪切、拉伸、过滤)。

13.2 图像格式转换

ImageMagick

ImageMagick 前面已经介绍过。它支持非常多的图片格式( 清单),基本上你听说过的,它都支持。甚至包括 Postscript 和 PDF。

在支持的格式中,它可以实现其中几十种格式的相互转换。

13.3 图像渲染

Cairo

Home:http://cairographics.org/

Wikipedia: 英文 中文

它提供了矢量图像的渲染功能。支持多种后端输出(Win32 GDI、OpenGL、Xlib、XCB、PDF、PNG、SVG ……)。

基于 C 语言开发,提供多种语言绑定(C++、Java、C#、Python、Ruby、Perl、Scheme、Smalltalk)。

cairomm

Home:http://cairographics.org/cairomm/

这是针对 Cairo 的 C++ 封装库。

Skia

Home:https://github.com/google/skia

Wikipedia:英文中文

它是 Google 基于 C++ 开发的图像渲染库。支持多种后端输出(rasterization、OpenGL、PDF、SVG、SWF ……)。

原先由 Skia 公司开发,后来该公司被 Google 收购。被用于 Android、Chrome、Chrome OS、Firefox 等知名开源项目。

PBRT(Physically Based Rendering Toolkit)

Home:[http://pbrt.org/]

基于光线追踪的物理渲染系统,采用 C++ 开发。

13.4 计算机视觉

OpenCV

Home:http://opencv.org/

Wikipedia:英文 中文

它是一个跨平台的计算机视觉库,由 Intel 发起并参与开发。开发语言是 C 和 C++。

提供其它编程语言(Python、Java、MATLAB/OCTAVE …)的 API 绑定。


14 多媒体

14.1 多媒体框架

FFmpeg

Home:http://ffmpeg.org/

Wikipedia: 英文 中文

名气非常大的开源多媒体框架,基于 C 和汇编开发,支持多种操作系统。

另外,该开源项目还提供了若干命令行工具,包含了一些辅助功能。

  • ffmpeg 格式转换工具

  • ffplay 简化版的播放器

  • ffserver 流媒体服务器

  • ffprobe 显示多媒体文件信息

几个知名的开源播放器(VLC、MPC-HC、xine)用到它,Google Chrome 也用到它。

Libav

Home:http://libav.org/

Wikipedia:英文

它是2011年从 FFmpeg 派生出来的。基于 C 语言开发,支持多种操作系统。

14.2 视频库

libavcodec

Home:http://ffmpeg.org/

它来自于 FFmpeg 社区,基于 C 语言实现,提供了多种视频格式和音频格式的编码/解码功能。

由于 Libav 从 FFmpeg 分裂出来,Libav 下也带有一个同名的库。

14.3 音频库

PortMedia & PortAudio

Home:http://www.portaudio.com/

Wikipedia: 英文

PortAudio 是 PortMedia 的组成部分,提供了音频的播放和录制功能。支持多种底层 API(ALSA、DirectSound、WASAPI、ASIO…)

OpenAL

Home:http://www.openal.org/

Wikipedia: 英文中文

C 语言开发的 3D 音效库,跨平台。最初由 Loki Software 开发。Loki 倒闭以后,这个项目由开源社区继续维护。


15 游戏

15.1 综合性的游戏引擎

id Tech 系列

Wikipedia:英文

这个系列来自于大名鼎鼎的 id Software 公司,由同样大名鼎鼎约翰·卡马克打造。

第一代诞生于1993年,是 DOS 时代的经典。

原先基于 C 和 汇编开发,从 id Tech 4 开始改用 C++ 开发。

  • id Tech 1——俗称:Doom 引擎

  • id Tech 2(Quake)——俗称:Quake 引擎

  • id Tech 2(Quake II)——俗称:Quake II 引擎

  • id Tech 3——俗称:Quake III 引擎

  • id Tech 4——俗称:Doom 3 引擎

Crystal Space

Home:http://www.crystalspace3d.org/

Wikipedia: 英文

以 C++ 编写,功能包括:2D 和 3D 渲染、音效、AI… 它的物理引擎基于 ODE 和 Bullet

Blender Game Engine

Home:http://www.blender.org/

Wikipedia: 英文 中文

它是 Blender 的组成部分,以 C++ 编写,使用 Python 脚本扩展。功能包括:3D 渲染、碰撞检测、角色编辑器、音效、网络通讯、AI、…

Panda3D

Home:http://www.panda3d.org/

Wikipedia: 英文

以 C++ 编写,用 Python 脚本扩展。虽然它的名字有“3D”,但它不仅仅是 3D 引擎,还包括了其它功能(碰撞检测、音效、关卡编辑器…)。

15.2 3D 渲染引擎

OGRE

Home:http://www.ogre3d.org/

Wikipedia:英文 中文

著名的 3D 渲染引擎,C++ 开发,诞生于2005年。支持很多操作系统(包括两大手机操作系统)。很多商业游戏用到它。

支持其它编程语言(Python、Ruby、Perl)的 API 绑定。支持 JVM 和 dotNet 平台。

Mesa 3D

Home:http://mesa3d.org/

Wikipedia: 英文 中文

使用 C 语言开发,它是针对 OpenGL 规范的【纯软件】实现(大部分 OpenGL 的实现都用到了显卡硬件)。

15.3 物理引擎

Bullet

Home:http://www.bulletphysics.org/

Wikipedia:英文 中文

采用 C 和 C++ 开发。电影《2012》用到它,游戏“侠盗猎车手”、“荒野大镖客”用到它。

Box2D

Home:http://www.box2d.org/

Wikipedia: 英文 中文

基于 C++ 开发的2维物理引擎。“愤怒的小鸟”用到它。

ODE(Open Dynamics Engine)

Home:http://www.ode.org/

Wikipedia: 英文 中文

诞生于2001年,采用 C 和 C++ 开发。

Newton Game Dynamics

Home:http://www.newtondynamics.com/

Wikipedia: 英文

基于 C++ 开发。


16 数值运算 & 科学计算

16.1 综合性的库

GSL(GNU Scientific Library)

Home:https://www.gnu.org/software/gsl/

Wikipedia:英文

由 GNU 官方提供,包括:复数、多项式、矩阵、线性代数、特征向量、快速傅里叶变换、统计、模拟退火……

代码示例——贝塞尔函数

  1. include <stdio.h>
  2. include <gsl/gsl_sf_bessel.h>
  3. double x = 5.0;
  4. double y = gsl_sf_bessel_J0(x);
  5. printf("J0(%g) = %.18e\n", x, y);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

16.2 有理数

Boost.Rational

Docs:http://boost.org/libs/rational

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了“有理数”的功能。

16.3 高精度数值运算

GMP(GNU Multiple Precision)

Home:https://gmplib.org/

Wikipedia: 英文 中文

基于 C 语言的高精度数值运算库,诞生于1991年,非常老牌。

代码示例——大整数相乘

  1. include <stdio.h>
  2. include <gmp.h>
  3. mpz_t x,y,result;
  4. mpz_init_set_str(x, "7612058254738945", 10);
  5. mpz_init_set_str(y, "9263591128439081", 10);
  6. mpz_init(result);
  7. mpz_mul(result, x, y);
  8. gmp_printf("%Zd\n", result);
  9. /* free used memory */
  10. mpz_clear(x);
  11. mpz_clear(y);
  12. mpz_clear(result);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
Boost.Multiprecision

Docs:http://boost.org/libs/multiprecision

Boost 前面已经介绍过。这是 Boost 的其中一个子库,实现了高精度数值运算。它还提供了针对 GMP 的数据类型的封装。

16.4 矩阵

Boost.uBLAS.Matrix

Docs:Matrix

Boost 前面已经介绍过。这是 Boost 提供的矩阵模板类。

代码示例

  1. include <boost/numeric/ublas/matrix.hpp>
  2. include <boost/numeric/ublas/io.hpp>
  3. using namespace boost::numeric::ublas;
  4. matrix<double> m(3, 3);
  5. for(unsigned i=0; i<m.size1(); i++)
  6. for(unsigned j=0; j<m.size2(); j++)
  7. m(i, j) = 3 * i + j;
  8. std::cout << m << std::endl;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
Dlib

Docs:http://dlib.net/linear_algebra.html#matrix

Dlib 前面已经介绍过。它提供了一个矩阵类。

16.5 线性代数

Boost.uBLAS

Docs:http://boost.org/libs/numeric/ublas

Boost 前面已经介绍过。这是 Boost 的其中一个子库,实现了 BLAS 的1、2、3级。

代码示例——计算矩阵与矢量的乘积

  1. include <iostream>
  2. include <boost/numeric/ublas/vector.hpp>
  3. include <boost/numeric/ublas/matrix.hpp>
  4. include <boost/numeric/ublas/io.hpp>
  5. using namespace boost::numeric::ublas;
  6. vector<double> v(2);
  7. v(0) = 1; v(1) = 2;
  8. matrix<double> m(2,2);
  9. m(0,0) = 0; m(0,1) = 1;
  10. m(1,0) = 2; m(1,1) = 3;
  11. vector<double> v2 = prod(m, v);
  12. std::cout << v2 << std::endl;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
Blitz++

Home:http://blitz.sourceforge.net/

Wikipedia: 英文

它是基于 C++ 实现的。其特色是:采用“模板元编程”的技术进行编译时计算,从而优化了性能。

Armadillo

Home:http://arma.sourceforge.net/

Wikipedia:英文

类似 Blitz++,Armadillo 也用了“模板元编程”的技术。

代码示例

  1. include <iostream>
  2. include <armadillo>
  3. using namespace std;
  4. using namespace arma;
  5. vec v;
  6. v << 2.0 << 5.0 << 2.0;
  7. // endr represents the end of a row in a matrix
  8. mat m;
  9. m << 1.0 << 2.0 << endr
  10. << 2.0 << 3.0 << endr
  11. << 1.0 << 3.0 << endr;
  12. cout << "Least squares solution:" << endl << solve(m,v) << endl;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
Dlib

Docs:http://dlib.net/linear_algebra.html

Dlib 前面已经介绍过。它提供了线性代数相关的封装类。


17 跨语言编程

17.1 整合多种语言的库

SWIG

Home:http://swig.org/

Wikipedia: 英文

这是一个很老牌的、有名气的工具,它可以把多种语言(Java、Python、C#、Ruby、PHP、Perl、Lua、Go ……)整合到 C/C++ 中。

整合之后,你的 C/C++ 程序就可以享受到其它这些语言的特性啦,非常爽!

17.2 整合单一语言的库

17.2.1 整合 Python 语言

Boost.Python

Docs:http://boost.org/libs/python

Boost 前面已经介绍过。这是 Boost 的其中一个子库,实现了 C++ 代码和 Python 代码的互操作。

代码示例——Hello world

  1. // 这是一个标准的 C 函数
  2. const char* greet()
  3. {
  4. return "Hello, world";
  5. }
  6. // 使用如下代码对上述函数进行包装
  7. include <boost/python.hpp>
  8. BOOST_PYTHON_MODULE(hello_ext)
  9. {
  10. using namespace boost::python;
  11. def("greet", greet);
  12. }
  13. // 以下是调用该模块的 Python 代码
  14. // import hello_ext
  15. // print(hello_ext.greet())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

18 (其它)

一些不方便归类的,暂时放到这里。

18.1 词法分析 & 语法分析

Boost.Spirit

Docs:http://boost.org/libs/spirit

Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了“基于 EBNF 的解析器框架”。


本内容转自 programthink 的 github


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/663861
推荐阅读
相关标签
  

闽ICP备14008679号