标准库之外,那些通用的第三方的c-c++库

动机

我自己一直基于c和c++来编程,但是时间久了会觉得于标准库过于简单,现成的“*”太少,在别的语言里各种强大的包多到飞起,直接import就能用起来。Cpp一直没有包管理机制(c++20才有了Modules的概念),要在孱弱的标准库之外扩展额外的库有不少工作要做。而且每种任务都无数的第三方库,貌似选择很多,却需要费心的去挑选,维护起来吃力不讨好。要是还要自己从源码编译,出点啥编译问题就更酸爽了。而且标准库连网络框架、json解析都没有,字符串处理停留在原始时代,没有官方的开发范式,c++是到了c++11才在标准库里有了线程,你敢信吗。

就算没有没有包管理功能,也不是说就不能提供一个强大的统一的库,起码boost就做的不错,而且远远走在了标准库前面。

我这里总结下自己知道的几个成熟的c/c++的通用库。这些库包含众多实用的功能,而且是跨平台的,能够提高项目开发效率。

boost

官网地址:https://www.boost.org/

这个太出名了,它是走在c++标准库前面的,c++11的很多功能几乎就是原封不动搬过来的。c++11以后没有以前那么耀眼,但是仍然是首选的第三方c++通用库。我自己特别需要的就是里面的xml及json解析功能,这是目前为止标准库不具备的功能。里面的asio网络模块也有很多项目在用,而且很早就有了,在标准库里暂时就别想了。

folly

facebookd出品的c++通用库,开源地址在:https://github.com/facebook/folly

里面不但有很多“*”功能,还有很多针对效率所做的优化,而且达到了工业级,不是一般人随便写的玩具。当然像网络库、配置文件解析和协程也都是支持的,各种字符操作非常全面。
特别是里面针对标准库的promise/future做了扩展,可以很容易的把调用链连接在一起,在异步编程时非常好用且强大。

需要说明的是,这是一个c++14的库,对编译器的要求高一些。

glib

首先glib不是glibc,也不是libc。区别如下:

glibc是linux下面c标准库的实现,即GNU C Library。glibc本身是GNU旗下的C标准库,后来逐渐成为了Linux的标准c库,而Linux下原来的标准c库Linux libc逐渐不再被维护。

而glib是Gtk+库和Gnome的基础。glib可以在多个平台下使用,比如 Linux、Unix、Windows 等。它由基础类型、对核心应用的支持、实用功能、数据类型和对象系统五个部分组成,可以在[http://www.gtk.org gtk网站]下载其源代码。是一个综合用途的实用的轻量级的C程序库,它提供C语言的常用的数据结构的定义、相关的处理函数,有趣而实用的宏,可移植的封装和一些运行时机能,如事件循环、线程、动态调用、对象系统等的API。

上面这段摘自:https://blog.csdn.net/yasi_xi/article/details/9899599

glib在github的项目地址是https://github.com/GNOME/glib。才不到1k的star数量,确实不是很火。但是要知道GTK都构建于glib的基础之上,还有流媒体应用的开源框架gstreamer也依赖于它。glib内部有非丰富的功能,可以说自成一派。

ACL

上面两个是国外的,下面介绍国内的ACL。

开源地址在:https://gitee.com/acl-dev/acl 或者 https://github.com/acl-dev/acl

官方介绍如下:
acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式、协程方式)的服务器程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、ICMP、redis、memcache、beanstalk、handler socket),常见流式编解码库:XML/JSON/MIME/BASE64/UUCODE/QPCODE/RFC2047 etc。

标准库之外,那些通用的第三方的c-c++库

目前作者本人还在维护着这个项目,社区活跃度还可以。从自我介绍也可以看出来这个项目主要是针对网络编程做了很多工作,弥补了标准库的不足。

作者对于每个模块都写了详细的说明 https://blog.csdn.net/zsxxsz 。有如此详细的中文资料,还有一群国内的同仁,这样的社区环境不可多得。

需要说明的是,ACL随然最早是一个综合的c语言库,但是内部的大部分功能都有c++的绑定。

ACL里我最喜欢的模块是协程模块fiber,这个模块是爱奇艺贡献的,它不仅支持协程之间的互斥和通信,还能支持协程与线程的互斥和通信,完成度很高,值得推广。fiber这个模块可以单独编译使用,它也有独立的开源地址:https://github.com/iqiyi/libfiber。

fiber模块的说明这里有:
爱奇艺网络协程编写高并发应用实践

TBOX

源码地址在,https://github.com/tboox/tbox
官方网页:https://tboox.io/#/zh-cn/getting_started

它的自我介绍是“A glib-like cross-platform C library”。这是一个比较纯粹的C语言库。

TBOX是一个用c语言实现的跨平台开发库。

针对各个平台,封装了统一的接口,简化了各类开发过程中常用操作,使你在开发过程中,更加关注实际应用的开发,而不是把时间浪费在琐碎的接口兼容性上面,并且充分利用了各个平*有的一些特性进行优化。
这个项目的目的,是为了使C开发更加的简单高效。
目前支持的平台有: Windows, Macosx, Linux, Android, iOS, *BSD等等。

看上去可能没ACL活跃,但是功能还是很全面和强大的,而且也支持网络和协程。特别是这个项目还包括了一个构件工具xmake,类似cmake,但是更强大。

总结:

上述几个标准库都是跨平台的,包含了非常丰富的功能。如果做技术选型的话,通用的c++项目我推荐boost,对性能有极致要求的c++项目我推荐folly。而C语言项目我推荐ACL和glib。

值得单独拿出来说的是ACL的协程模块fiber,以及folly强化过的promise/future。