转至:http://blog.csdn.net/x356982611/article/details/53187766?%3E
说明
本页面汇总俺收集的各种 C 和 C++ 的开源代码库,不定期更新。
如果你发现本页面的开源库有错漏之处,非常欢迎给俺提供反馈——有 GitHub 帐号的同学,可以给俺发 issue;没帐号的同学,可以去俺博客留言。
1 综合性的库
Boost
Home:http://boost.org/
Boost 大概是最重要的第三方 C++ 库。其作者有很多是 C++ 标准委员会的成员。Boost 的很多子库后来都成为 C++ 的标准库。
本页面的其它章节还会继续提及 Boost 在各种领域的应用。
wxWidgets
这是一个非常老牌的 C++ 开源 GUI 框架,诞生于1992年。原先叫做 wxWindows,后来因为微软的法律纠纷,改为现名。
它支持的操作系统平台很多(包括嵌入式系统)。
很多开源项目用到它,比如:BitTorrent、aMule、FileZilla、Code::Blocks、Dolphin……
虽然它以 GUI 为主,但是也提供了其它一些辅助功能(比如:进程间通讯、网络、数据库、多媒体……)
Qt
Home:http://www.qt-project.org/
这是一个非常老牌的 C++ 开源 GUI 框架,于1995年发布 1.0 版本。原先由 Trolltech 公司维护,后来该公司被 Nokia 收购。
它支持的操作系统平台很多(包括嵌入式系统)。
虽然它以 GUI 为主,但是也提供了其它一些辅助功能(比如:网络、数据库、多媒体、3D引擎……)
APR(Apache Portable Runtime)
这是由 Apache 社区维护的 C 开源库,主要提供操作系统相关的功能(文件系统、进程、线程、用户、IPC)。此外还提供了一些网络相关的功能。
APR 原先是 Apache Web 服务器的一个组成部分,后来独立出来,成为一个单独的开源项目。
ACE(Adaptive Communication Environment)
Home:ACE
这是一个跨平台的 C++ 库,提供了一套网络通讯的框架;另外还支持线程、进程和 IPC。
POCO
Home:POCO
Wikipedia: 英文
它的名称源自“POrtable COmponents”,是一个基于 C++ 的开源库。
它的功能以网络通讯为主,同时也提供一些其它功能(比如:多线程、进程间通讯、数据库、XML、JSON……)
Dlib
Home:[http://dlib.net/]
Wikipedia:英文
诞生于2002年的 C++ 开源库,提供了非常多的功能(网络、多线程、GUI、数值计算、图像处理、数据挖掘……)。
它还有一个特色是:同时提供了 Python API :)
Crypto++
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
- 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
- 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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
2.3 字符串处理
2.3.1 字符集
Boost.Locale
Docs:locale
Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了各种“本地化”的功能。其中就包括字符集编码转换。
代码示例
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Boost.Lambda
Docs:http://boost.org/libs/lambda
Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了“匿名函数/无名函数”的功能。
注:Boost 的这个子库已经进入 C++ 11 标准。
代码示例
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
GTK+
Home:http://www.gtk.org/
老牌的 GUI 框架,诞生于1998年。原先叫做“GIMP Toolkit”,是基于 C 开发的跨平台界面组件库。
代码示例——Hello world
- 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/
它的全称是“Fast, Light Toolkit”。如其名,它非常轻量级。用它写一个“Hello World 应用”,静态链接后大约才 100KB
代码示例——Hello world
- 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/
这是微软雇员 Nenad Stefanovic 开发的开源 GUI 框架。开发 WTL 是为了提供一个轻量级的 MFC 替代品。
6.2 图表(Chart)
Qt
Docs:http://doc.qt.io/QtCharts/
Qt 前面已经介绍过。它内置了一套 Chart 的封装类。
代码示例——饼图
- 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
- 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/
ncurses 是“new curses”的缩略词,它是 curses 库的自由软件克隆,诞生于1993年。
大名鼎鼎的 Eric S. Raymond 曾参与早期版本的开发。
8 网络
8.1 链路层 & 网络层
libpcap
Wikipedia: 英文
很著名的 Sniffer 抓包库,基于 C 语言开发。
代码示例——一个简单的抓包示例
- 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
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/
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
- 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
看名字就知道这是 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
这是一个 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
- 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)
ZeroMQ 是一个轻量级、跨平台的开源库,提供了高性能、异步的消息队列。采用 C++ 开发,提供了多种语言的绑定。
与传统的消息中间件不同,使用 ZeroMQ 不需要额外的“消息代理(message broker)”。
俺曾经写过一篇博文推荐它(在“ 这里”)。
代码示例——TCP Server
- 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
- 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/
这是一个面向对象的通讯中间件,诞生于2002年。支持不同编程语言的通讯。
它的设计借鉴了 CORBA,好在没有 CORBA 那么复杂。
libevent
Home:http://libevent.org/
它提供了异步事件处理机制。在网络开发中,可以用它替代传统的“event loop”,有助于简化代码。
它被一些知名的开源项目使用(比如: Tor、memcached)。
代码示例——HTTP Server(本示例基于 ANSI C)
- 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
- 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
看名称就能猜到它跟 libevent 很像。实际上,你可以把 libev 视为 libevent 的竞争性替代品。
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
名气最大的开源数据库,诞生于1995年,采用 C 和 C++ 语言开发。如今隶属于 Oracle 公司。
PostgreSQL
名气仅次于 MySQL 的开源数据库,诞生于1996年。采用 C 语言开发。
SQLite
Home:http://sqlite.org/
它是一个很优秀的嵌入式(进程内)数据库,非常轻量级,支持各种作系统平台。采用 C 语言开发。
俺前几年写过一篇博文推荐它(在“这里”)。
MongoDB
Wikipedia:英文
这是近几年兴起的 NoSQL 数据库的一员。它本身是基于 C++ 和 C 开发的。
Redis
Home:[http://redis.io/]
诞生于2009年,是目前(2014~2015)最流行的键值存储数据库,基于 C 语言开发。
以性能高而著称,很多大型网站用到它(Twitter、GitHub、Flickr、Instagram、百度、新浪、腾讯、搜狐)
Berkeley DB(BDB)
Home:http://www.oracle.com/us/products/database/berkeley-db/
诞生于1994年,是一个很老牌的嵌入式(进程内)数据库,提供“键值存储”的功能,基于 C 语言开发。
开发 BDB 的公司于2006年被 Oracle 收购。
很多开源项目用到它。甚至 MySQL 也包含了一个基于 BDB 的存储后端。
LevelDB
Home:https://github.com/google/leveldb
它是 Google 基于 C++ 开发的 NoSQL 数据库,提供“键值存储”的功能。
号称速度很快,内置数据压缩(基于 Snappy 库)。
比特币项目用到它。Facebook 基于它开发出 RocksDB 数据库。
Firebird
Home:http://www.firebirdsql.org/
它是2000年的时候,从 Borland 公司的 InterBase 数据库派生出来的。
基于 C++ 开发,支持多种操作系统平台。
关于它有个插曲:Firefox 浏览器曾经用过“Firebird”这个名称,因为跟 Firebird 数据库同名,后来才改用 Firefox 这个名称。
ScyllaDB
这是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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
代码示例——查询
- 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/
大名鼎鼎的 Apache,诞生于1995年,采用 C 和 C++ 开发。长期作为 Web Server 市场份额的老大。
Nginx
Home:http://nginx.org/
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
- 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
它是很多浏览器使用的渲染引擎,基于 C++ 开发。
Gecko
Home:https://developer.mozilla.org/
它是 Firefox 的渲染引擎,基于 C++ 开发,由 Mozilla 社区维护。
10.4 浏览器整合
CEF(Chromium Embedded Framework)
Home:https://bitbucket.org/chromiumembedded/cef
Wikipedia: 英文
如其名,它提供了嵌入 Chrome 浏览器的框架。采用 C++ 开发。好几个商业公司(Google、Adobe、Facebook、Evernote…)的产品用到它。
以下是其它开源项目针对 CEF 的扩展,提供了其它编程语言的绑定。
-
dotNet (CEF1) - https://bitbucket.org/fddima/cefglue
-
dotNet/Mono (CEF3) - https://bitbucket.org/xilium/xilium.cefglue
-
dotNet (CEF3) - https://bitbucket.org/chromiumfx/chromiumfx
-
Delphi (CEF3) - https://github.com/hgourvest/dcef3
PhantomJS
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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
OpenSSL
OpenSSL 基于 C 语言开发,在加密领域那可是大名鼎鼎。大部分常用的加密算法(对称、非对称)和散列算法,它都支持。
很多知名的软件(包括 Web Server)用到它,所以2014年的“心脏滴血漏洞”让好多网站中招。
LibreSSL
OpenSSL 爆出“心脏滴血漏洞”之后,OpenBSD 社区的程序员复制了 OpenSSL 版本 1.0.1g 的代码,然后另起炉灶。
LibreSSL 的主要目标是“安全性”,其维护人员删除了原 OpenSSL 中大量过时的代码,替换了相关的内存管理函数(规避缓冲区溢出),增强了随机数生成算法….
GnuTLS
Home:http://gnutls.org/
Wikipedia: 英文
采用 C 语言开发,名气也挺大。如其名,主要提供 TLS/SSL 的相关功能。
NaCl
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
- 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
- 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/
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
该项目的开发已经停止。只支持对 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
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
- 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
ImageMagick 可说是最强大的开源图片处理工具集,采用 C 语言编写。诞生于1990年,其开发至今依然非常活跃。支持非常多的操作系统平台。
它提供许多编程语言的 API,对于 C++ 是 Magick++,对于 C 是 MagickWand
Boost.GIL(Generic Image Library)
Docs:http://boost.org/libs/gil
Boost 前面已经介绍过。这是 Boost 的其中一个子库,实现了图像处理功能。
代码示例——调整图像尺寸
- 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/
它提供了矢量图像的渲染功能。支持多种后端输出(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
它是 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/
它是一个跨平台的计算机视觉库,由 Intel 发起并参与开发。开发语言是 C 和 C++。
提供其它编程语言(Python、Java、MATLAB/OCTAVE …)的 API 绑定。
14 多媒体
14.1 多媒体框架
FFmpeg
Home:http://ffmpeg.org/
名气非常大的开源多媒体框架,基于 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
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
它是 Blender 的组成部分,以 C++ 编写,使用 Python 脚本扩展。功能包括:3D 渲染、碰撞检测、角色编辑器、音效、网络通讯、AI、…
Panda3D
Wikipedia: 英文
以 C++ 编写,用 Python 脚本扩展。虽然它的名字有“3D”,但它不仅仅是 3D 引擎,还包括了其它功能(碰撞检测、音效、关卡编辑器…)。
15.2 3D 渲染引擎
OGRE
著名的 3D 渲染引擎,C++ 开发,诞生于2005年。支持很多操作系统(包括两大手机操作系统)。很多商业游戏用到它。
支持其它编程语言(Python、Ruby、Perl)的 API 绑定。支持 JVM 和 dotNet 平台。
Mesa 3D
Home:http://mesa3d.org/
使用 C 语言开发,它是针对 OpenGL 规范的【纯软件】实现(大部分 OpenGL 的实现都用到了显卡硬件)。
15.3 物理引擎
Bullet
Home:http://www.bulletphysics.org/
采用 C 和 C++ 开发。电影《2012》用到它,游戏“侠盗猎车手”、“荒野大镖客”用到它。
Box2D
基于 C++ 开发的2维物理引擎。“愤怒的小鸟”用到它。
ODE(Open Dynamics Engine)
Home:http://www.ode.org/
诞生于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
- 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/
基于 C 语言的高精度数值运算库,诞生于1991年,非常老牌。
代码示例——大整数相乘
- 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
- 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
- 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
- 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
- 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