C/C++ 程序库

C/C++ 程序库

 

// ---------------------------------------------

来几个不常见但是很变态的库吧:

 

bundle: 把几乎所有常见的压缩库封装成了一个库, 接口完全统一, 想用哪个用哪个.

就一个h和一个巨TM大的cpp文件,巨好使巨方便.

r-lyeh-archived/bundle

 

Celero: 简单清晰的benchmark库, 特点就是简单易用没有废话.

DigitalInBlue/Celero

 

getopt: 解析命令行输入参数的库, 好使! 没废话! 就俩文件.

r-lyeh-archived/getopt

 

stb_image: 常见图片格式加载库, 就一个巨大无比的头文件

stb_truetype: 常见字体加载库, 就一个巨大无比的头文件, 觉得freetype大的可以用它.

都在这: nothings/stb

 

better-enums: 编译期实现的enum扩展功能,包括enum和字符串互转等等. 感觉比较重量级, 我一般是不用的, 但有时候没它还真是别扭, 尤其是需要把一个enum序列化的时候.

aantron/better-enums

 

Catch2: 著名的单元测试框架, 那么它和boost或者google的单元测试框架有什么不同呢?

就在于它首先是header only的, 其次是没有废话,直击要害! 你要测试对吧? 给你!

catchorg/Catch2

 

uchardet: 实现猜字符串编码的功能, 例如输入一个不知道编码的文本文件, 它可以帮你"猜" 这个文件的编码是什么. 和python里的uchardet功能基本一样.

BYVoid/uchardet

 

win-iconv: iconv库是一个字符集编码转换的库, 在linux和mac下均是原生字符转换库. 但windows上并不是自带的. 那么就会导致在windows上编译iconv有点浪费. 因为windows显然已经自带字符集转换的功能了. 那么这个库的作用就是用windows api来实现和iconv库一模一样的接口. 这样编译出来比较小. 从此字符转换不是梦.

win-iconv/win-iconv

 

freetype-gl: open gl 上实现的freetype. 不过我个人没用过... 不知道好不好用. 但当你需要在opengl上下文中渲染字体的时候, 你可能用得着它.

rougier/freetype-gl

 

nanovg: 基于openGL/DX/metal的2d绘图库. 绘图效率高, 接口清晰. 主版本是基于openGL的, 但有DX,metal等分支. 前端接口还有python和lua的. 个人感觉不错.

memononen/nanovg

 

imgui: 大名鼎鼎的imgui, 你可能会问在有一堆GUI框架的情况下为什么我们需要imgui? 因为它是immediate mode的. 个人认为是几个immediate mode的GUI框架里最好的. 详细见它的页面介绍.

r-lyeh-archived/imgui

 

spdlog: logger库, 重点推荐! 为什么呢? 因为好使! 没有废话. 而且是header only的.

gabime/spdlog

 

ffts: 很好使的FFT库, 和fftw的不同在于用着是真方便! 而且难能可贵在于速度居然真不比fftw慢.

linkotec/ffts

 

fmt: formatting库, 又小又好使! 太好使了!

fmtlib/fmt

 

最后是恐怖的Amalgamate.

vinniefalco/Amalgamate

它是干嘛的呢? 它是专门用来把其他库"封装成"一个cpp和一个h文件的工具. 比如说freetype里有几十个h几十个cpp, 用起来觉得麻烦的话, 就写个配置文件然后用它跑一下, 立即就可以把freetype的这些cpp和h文件变成仅仅两个巨大无比的cpp和h文件. 再重复一遍, 巨大无比!! 这便是传说中的unity build.... 目前github上已经有很多的人开始用它来封装一些常见的库了.

 

这样做有什么好处呢? 比如说有个库,

 

那么这么做好不好呢, 我也不知道. 前文中提到的bundle库就是用它把N多库合并到一个cpp里的.

这个工具的作者vinniefalco还写了beast库, 目前已收录进了boost里.

 

freetypeAmalgam: 利用上面的工具把整个freetype封装成了一个h和一个cpp, 想用freetype又懒得编译和配置的人就把这两个文件往项目里一拖, 就可以用freetype了.

 

vinniefalco/FreeTypeAmalgam

 

//--------------------------------------------------

 

再补充几个吧:

 

上面说的iconv的win32实现复杂了一点, 这个更简单:

 

PFFFT: 又一个FFT库, 那么你也许会问它和FFTW相比如何呢? 它的好处就是真的很小! 两个文件往项目里一拖就行了:

 

bgfx: 超恐怖的跨平台图形渲染库, windows mac linux ios 安卓html...跨的平台基本全了, 它的后端就更可怕了, DX, opengl, metal... 连webgl都有. 我不怎么搞这方面, 也不知道好不好使, 我只是觉得很牛就放这里了:

bkaradzic/bgfx

 

scriptorium: 这个就不算是库了, 是几乎所有你听说过的没听说过的常见用于游戏脚本的语言的benchmark, 可以不去研究, 但不妨看看:

r-lyeh-archived/scriptorium

 

tinyexpr: 我特别喜欢的数学表达式解析和计算库, 真的好用而且小, 专门用来实现在程序运行时解析用户输入的数学表达式并做计算的库, 只有两个文件, 往项目里一拖就行了:

codeplea/tinyexpr

 

matplotcpp: 在C++中绑定python的matplot库.

lava/matplotlib-cpp

 

// ---------------------------------------------

 

A. 自己写一遍太累
B. 写得很好
C. 实用且满足我的需求
D. 好用不折腾
E. 代码有深度且可读性高,可以挖宝贝

 

Update: 再加两个没人提的

  • BCD: 又小又快又方便的单元测试库,嗯测试很重要: onqtam/doctest
  • ABCDE: 高精度浮点数运算库,Fabrice Bellard 一出手总是把很复杂的东西弄得跟玩似的,境界真的高: LibBF Library

 

// ---------------------------------------------

做存储, 数据库系统方面的开发,主要用到

* grpc/libevent/libev/libasio 实现高性能网络服务器
* protobuf 数据结构序列化/反序列化,方便数据交换
* LevelDB/RocksDB 嵌入式KV数据库
* snappy/zlib/lz4 数据压缩,解压缩
* jemalloc/tcmalloc 高效内存分配器,尤其多线程场景
* jerasure Reed Solomon编解码,给存储系统实现erasure code
* murmurhash… 实现hash摘要
* crc32 数据存储或传输时的数据校验
* cJSON 解析json格式配置文件
* libBSON JSON序列化/反序列化,MongoDB使用这种格式存储数据
* boost 功能丰富的C++基础库,轻度使用,C++11/14后基本不用了。
* libRedis redis是一个数据库服务,并不是单独的库,但其代码精简,质量非常高,里面很多代码都可以拿出来直接复用,比如网络,各种数据结构的实现。

 

// ---------------------------------------------

泛用库Boost,界面库Qt,通信库ZeroMQ,视觉库OpenCV,并发库tbb,深度学习Caffe,序列化Protobuf ,加上一些cppformat之类的小库

 

// ---------------------------------------------

stl就不说了, 目前后端开发,常用库

字符串算法库 Boost String Algorithms Library

IO框架 Boost.asio boost.fiber boost.beast 组合起来就是一个基于协程的io框架

堆栈跟踪 Boost.Stacktrace 需要配合libbacktrace库

CRC验证 Boost.CRC

日期时间库 Boost.Date_Time

uuid Boost.Uuid

类型转换 Boost.Lexical_Cast 注,这货可以转boost里的很多类型,比如 uuid ptime date等,不需要其它处理

命令行输入参数解析 Boost.Program_options

随机数 Boost.Random

各种字符集转换 Boost.Locale 这货本地化库,功能很多,我一般只用它的字符集互转

文件系统 Boost.Filesystem 一般只是用它来判断文件存不存在,拼路径,用的功能比较少

Log库 Boost.Log 很强大的日志系统,要同步有同步,要异步只需要改几行代码,支持syslog,注意不支持 syslog RFC5424规范,只支持比较老的 RFC3164规范,我参考 boost log库里的实现和RFC5424格式弄了个简单的包装。

异常库 Boost Exception 配合Boost.Stacktrace可以抛出带堆栈信息的异常类。

http/2库 nghttp2 苹果推送需要http/2

数据库方面 soci,可以拉最新master分支代码,可以hook断线重连,有了这个,配合数据库主从集群模式,在主库故障时,从库升为主库时,服务可以自动连新的主库,完全不用人工干预,是不是很省心,不过这功能只支持postgresql和oracle数据库,虽然pg-pool数据库网关也可以实现postgresql 类似的功能,但以前遇到过在主从模式无任何故障下,更新数据后马上查询,查到的数据有概率不是刚更新的,应该是被pg-pool分到了从库去查了。 另外可以容易扩展自定义类型支持,比如boost uuid ptime类型,只需写2个类型转换函数就支持了。

libssh2 这个库我一般不用它来加密,只是用它来做反向隧道和正向隧道,不了解的可以百度下。

cpp-jwt 这个库用来JSON Web Token JWT验证,苹果推送需要这玩意

json 一个只有头文件的json库,不多说很强大很现代c++

 

一个抛出错误码和0到8层堆栈信息的简单函数

typedef boost::error_info<struct tag_stacktrace, boost::stacktrace::stacktrace> exception_stack;
typedef boost::error_info<struct tag_global_error_code, int> exception_error_code;

template <class E>
void throw_with_trace_code(const E &e, int ecode)
{
    throw boost::enable_error_info(e)
            << exception_stack(boost::stacktrace::stacktrace(0, 8)) << exception_error_code(ecode);
}

一个参考boost log库中syslog实现, 支持RFC5424规范的syslog实现

namespace boost {
BOOST_LOG_OPEN_NAMESPACE
namespace sinks {
    class syslog_udp5424_backend :
            public basic_formatted_sink_backend< char >
    {
        //! Base type
        typedef basic_formatted_sink_backend< char > base_type;
        typedef boost::log::aux::light_function< syslog::level (record_view const&) > severity_mapper_type;
    public:
        /*!
         * Constructor. Creates a UDP socket-based backend with <tt>syslog::user</tt> facility code.
         * IPv4 protocol will be used.
         */
        BOOST_LOG_API syslog_udp5424_backend() : m_socket(m_service)
        {

        }
        /*!
         * Destructor
         */
        BOOST_LOG_API ~syslog_udp5424_backend()
        {

        }

        BOOST_LOG_API void set_severity_mapper(severity_mapper_type const& mapper)
        {
            m_level_mapper = mapper;
        }

        BOOST_LOG_API void set_target_address(std::string const& addr, unsigned short port = 514)
        {
            m_process_name = boost::log::aux::get_process_name();
            if(m_process_name.empty())
            {
                m_process_name = "-";
            }
            m_process_id = boost::lexical_cast<string>(boost::log::aux::this_process::get_id().native_id());

            boost::system::error_code ec;
            m_local_hostname = asio::ip::host_name(ec);
            if(m_local_hostname.empty())
            {
                m_local_hostname = "-";
            }
            boost::asio::ip::address vaddr = boost::asio::ip::address::from_string(addr);
            m_target_host = asio::ip::udp::endpoint(vaddr, port);
            if(vaddr.is_v4())
            {
                m_socket.open(boost::asio::ip::udp::v4());
            }
            else
            {
                m_socket.open(boost::asio::ip::udp::v6());
            }
        }

        BOOST_LOG_API void consume(record_view const& rec, string_type const& formatted_message)
        {
            send(m_level_mapper.empty() ? syslog::info : m_level_mapper(rec),
                 formatted_message);
        }

    private:
        void send(syslog::level lev, string_type const& formatted_message)
        {
            int pri = m_facility | static_cast<int>(lev);
            std::time_t t = std::time(nullptr);
            std::tm ts;
            std::tm* time_stamp = boost::date_time::c_time::localtime(&t, &ts);

            // RFC5424
            char packet[2048];
            int n = boost::log::aux::snprintf
                    (
                        packet,
                        sizeof(packet),
                        "<%d>1 %4d-%02d-%02dT%02d:%02d:%02d %s %s %s %s - %s",
                        pri,
                        time_stamp->tm_year + 1900,
                        time_stamp->tm_mon + 1,
                        time_stamp->tm_mday,
                        time_stamp->tm_hour,
                        time_stamp->tm_min,
                        time_stamp->tm_sec,
                        m_local_hostname.c_str(),
                        m_process_name.c_str(),
                        m_process_id.c_str(),
                        m_msg_id.c_str(),
                        formatted_message.c_str()
                        );
            if (n > 0)
            {
                std::size_t packet_size = static_cast<std::size_t>(n) >= sizeof(packet) ? sizeof(packet) - 1u : static_cast< std::size_t >(n);
                m_socket.send_to(asio::buffer(packet, packet_size), m_target_host);
            }
        }

    private:
        boost::asio::io_service m_service;
        boost::asio::ip::udp::socket m_socket;
        severity_mapper_type m_level_mapper;
        asio::ip::udp::endpoint m_target_host;
        std::string m_local_hostname;
        std::string m_process_name;
        std::string m_process_id;
        std::string m_msg_id = "-";
        int m_facility = syslog::user;

    };
}
BOOST_LOG_CLOSE_NAMESPACE
}

 

// ---------------------------------------------

关于可借鉴的C/C++ 程序库,我特意整理了一波与大家分享,覆盖标准库、名气库、网络通信、字符串、线程等,希望对大家有帮助。

C++程序库推荐:

标准库:标准库中提供了C++程序的基本设施,虽然C++标准库折腾了很多年才正式出台,但是在标准库的实现上却很令人欣慰得看到多种实现,并且已被实践证明为有工业级别强度的佳作。
  • Dinkumware C++ LibraryP.J.Plauger编写的高品质的标准库,值得一提的是,其编写的库长期被Microsoft采用。
  • RogueWave Standard C++ Library这个库在Borland C++ Builder的早期版本中曾经被采用,后来被其他的库给替换了。
  • SGI STLSGI公司的C++标准模版库。
  • STLportSGI STL库的跨平台可移植版本。

C++名气库推荐:

Boost总体来说是实用价值很高,质量很高的库,现代C++的开发者必备的工具。很多Boost中的库功能堪称对语言功能的扩展,Boost另外一面,比如Graph这样的库则是具有工业强度,结构良好,非常值得研读的精品代码,并且也可以放心的在产品代码中多多利用。Boost中比较有名气的库推荐:
  • Regex 正则表达式库
  • Spirit LL parser framework,用C++代码直接表达EBNF
  • Graph 图组件和算法
  • Lambda 在调用的地方定义短小匿名的函数对象,很实用的functional功能
  • concept check 检查泛型编程中的concept
  • Mpl 用模板实现的元编程框架
  • Thread 可移植的C++多线程库
  • Python 把C++类和函数映射到Python之中
  • Pool 内存池管理

 

GUI :在众多C++的库中,GUI部分的库算是比较繁荣,也比较引人注目的。在实际开发中,GUI库的选择也是非常重要的一件事情,下面我们综述一下可选择的GUI库,各自的特点以及相关工具的支持。
  • MFC:虽然从技术角度讲,MFC是不大漂亮的,但是它构建于Windows API之上,能够使程序员的工作更容易,编程效率高。
  • QT多平台的C++图形用户界面应用程序框架,提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。
  • WxWindows跨平台的GUI库。因为其类层次极像MFC。

 

网络通信
  • ACEC++库的代表,超重量级的网络通信开发框架,可跨越多种平台完成通用的通信软件任务。
  • StreamModule设计用于简化编写分布式程序的库。尝试着使得编写处理异步行为的程序更容易,而不是用同步的外壳包起异步的本质。
  • SimpleSocket基于socket的客户/服务器程序更加容易。
  • A Stream Socket API for C++又一个对Socket的封装库。

 

线程
  • C++ Threads这个库的目标是给程序员提供易于使用的类,这些类被继承以提供在Linux环境中很难看到的大量的线程方面的功能。
  • ZThreads跨平台的C++线程和同步库。

 

字符串
  • C++ Str Library操作字符串和字符的库,支持Windows和支持gcc的多种平台。
  • Common Text Transformation Library解析和修改STL字符串的库。
  • GRETA由微软研究院的研究人员开发的处理正则表达式的库,在小型匹配的情况下有非常优秀的表现。

 

C语言开源项目:
  • Webbench在Linux下使用的非常简单的网站压测工具,使用C语言编写, 代码超级简洁,源码加起来几乎不到600行。
  • Tinyhttpd超轻量型Http Server,C语言开发,附带简单的Client,可通过阅读这段代码理解一个 Http Server 的本质。
  • cJSONC语言中的一个JSON编解码器,非常轻量级,速度非常理想。结构简单易懂,可以作为一个非常好的C语言项目进行学习。
  • CMockeryGoogle发布的用于C单元测试的一个轻量级的框架。它很小巧,对其他开源包没有依赖,对被测试代码侵入性小。
  • Libev基于Reactor模式,效率较高,并且代码精简,是学习事件驱动编程的很好的资源。
  • MemcachedMemcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。
  • Lua在任何支持ANSI C编译器的平台上都可以轻松编译通过。
  • SQLiteSQLite是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。
  • NETBSDNetBSD是一个免费的,具有高度移植性的 UNIX-like 操作系统,是现行可移植平台最多的操作系统。

 

内容来源:C++著名程序库的比较和学习经验 - CSDN博客,转载请注明。

编辑于 2019-01-15

 

// ---------------------------------------------

  1. 应用开发框架Qt,我的最爱,我还写了两本相关的书,《Qt Quick核心编程》和《Qt on Android核心编程》。优雅的信号与槽,强大的界面类库,跨平台。
  2. CEF(Chromium Embedded Framework),使用网页做富客户端的绝佳选择,基于Chromium,可以方便嵌入到你的应用中。类似的还有 Electron 。
  3. WebRTC,非常赞的框架,做音视频通信绕不开的。
  4. TinyXml,小巧的C++ XML库,几个源文件,直接加入到项目中就可以用
  5. Protobuf,Google的,网络通信,非常赞,方便序列化和结构化,流量又小
  6. FreeImage,强大好用的图形库
  7. Libevent,轻量级的基于事件驱动的高性能的开源网络库
  8. ffmpeg,多媒体开发类库的无冕之王

// ---------------------------------------------

自己最常用的几个:
curl
zlib
sqlite
opencv
 

// ---------------------------------------------

nana,一个非常容易上手的 C++ gui 库

在此之前我一直以为,除了 Qt 以外,用 C++ 开发图形化界面的应用是非常难的,需要写一大长串的不明所以的代码,直到遇到这个库

项目官网

 

// ---------------------------------------------

写几个我最经常用的吧:

1、科学家算GSL:GNU Scientific Library

基本上能满足用C做科学计算的要求:

The complete range of subject areas covered by the library includes,

Complex NumbersRoots of PolynomialsSpecial FunctionsVectors and MatricesPermutationsSortingBLAS SupportLinear AlgebraEigensystemsFast Fourier TransformsQuadratureRandom NumbersQuasi-Random SequencesRandom DistributionsStatisticsHistogramsN-TuplesMonte Carlo IntegrationSimulated AnnealingDifferential EquationsInterpolationNumerical DifferentiationChebyshev ApproximationSeries AccelerationDiscrete Hankel TransformsRoot-FindingMinimizationLeast-Squares FittingPhysical ConstantsIEEE Floating-PointDiscrete Wavelet TransformsBasis splinesRunning StatisticsSparse Matrices and Linear Algebra
从最优化 到 排序 到 线性代数、稀疏矩阵,功能是很全的。

当然,有条件的可以用Intel的MKL:

2、最优化工具包,NLopt:NLopt Reference

一般简单问题GSL的最优化包也够用了,不过如果碰到有约束之类的问题,NLopt包是个不错的选择。

3、OpenMP、OpenMPI

不多解释了,两种不同类型的并行计算模型。
 

// ---------------------------------------------

http客户端curl

http服务器 crow

gzip压缩zlib

json序列化nlohmann/json

二进制序列化protobuf

嵌入式数据库sqlite

日志库glog

参数解析库gflags

消息队列zmq

rpc库brpc

tcp网络库evpp

3d仿真osg

图形图像opencv

stl,boost,qt就不用说了。

不是我说,大家老老实实做调包侠,赚钱才是王道。

windows下开发,强烈推荐vcpkg,了却找第三方库,编译第三方库的烦恼。

// ---------------------------------------------

高性能并发队列,头文件模板库moodycamel。支持轮询和阻塞两种模式,cas锁。性能比boost和tbb的并发队列都要好。

tinyxml2,用来解析xml的。

// ---------------------------------------------

说几个跟化学相关的:

1. Open Babel,C++ 开发的,GPLv2。自由在几十种分子结构的文件格式之间转换,还带有简单的优化、绘图功能。虽然我觉得最好用的是它的 Python binding。

2. Gromacs,当前最流行的分子动力学模拟库,高性能,针对几乎所有平台都有优化。原本是 C 语言开发的,现在在向 C++ 迁移,已经完成大半了。是最好用的吗?按照我同事的话来讲就是“首先你要有个对手才可以比好不好用呀”。这个和 OpenBabel 一样,虽然本身也是一个软件,但作为 C++ 的库链接到你自己写的程序里会相当相当好用。对了,它还是 LGPL 开源的。

3. BALL Project,主体是 C++ 开发的,有少量 C 代码。它是一个主要为分子生物学和分子建模而生的工具库。有一个叫做 View 的扩展用来可视化结构文件很不错。提供类似功能的库其实有很多,比如 OpenMM 以及上面提到的那两个,不过我觉得 BALL 还是最全面健壮的,还支持扩展。最关键的,它也是 LGPL 协议开源的。

// ---------------------------------------------

越来越nb的STL,在尝试从Qt迁移中

直接影响cpp发展的,除了GUI等偏业务的,其他几乎啥都干的库,boost,目前在入门中

nb程度直追boost的folly,不过暂时没空学

Qt,同样是万能类库,同时还是强大的GUI库

大数字运算库GMP

计算机视觉库OpenCV,大学时玩过,不是一般的nb

// ---------------------------------------------

GLib

FFmpeg

fftw

boost

Catch2

libuv

http_parser

OpenSSL

libsodium

MsgPack

cblas

SQLite

Redis

cJSON

// ---------------------------------------------

我来布道GNU的那一套吧。

Glib:C基础库,提供了容器、原子操作、线程、抛异常、字符串等基础设施。

GObject:在C里面实现比C++更彻底的对象系统。Gtk3的GObject有很彻底的introspection能力,比如运行时自动生成脚本语言绑定。代价是写类型需要一堆恶心的宏。

Cairo:2D绘图库,功能全面,支持多种绘图表面,包括内存位图、矢量文件(PDF、PostScript、SVG)、窗口表面。主要问题是在Windows上的屏幕绘图是用GDI实现的,神特么慢。

Gtk:GUI开发架构。它几乎所有的玩意都可以绑事件,事件化的程度比Qt Widgets还要彻底。Gtk Builder使用布局描述XML在运行时构建GUI,并且自动绑定回调函数(代价是必须暴露回调函数到符号表)。基于GObject既是它的好处(彻底的事件化),也是它的缺点(写个新Gtk类型需要一堆恶心的宏)。

// ---------------------------------------------

我推荐一个貌似没被提及的:

用于解析命令行参数,个人觉得比gflags高级多了。

// ---------------------------------------------

1. I/O框架库libevent

2. 二进制序列化库protobuf

3. boost库的asio和shared_ptr(不过后者已经在C++11里包括了)

4. 日志系统Log4cXX

5. XML解析库tinyXML

6. json解析库jsoncpp

7. 小巧的关系型数据库SQLite

8. key-value的Redis

9. 计算机视觉库opencv

10. 数学公式解析库muparserX系列

11. google的kv数据库leveldb,源码很适合学习

12. 可以做深度学习封装了socket封装了pthread等一大堆功能的dlib,很爽。

13. 深度学习库caffe,现在想到的就有这些,以后补充。。。

// ---------------------------------------------

如果只选择一个的话,我会选 gperftools,Sanjay 大神出品,包含了 tcmalloc 以及 profiler,其中,profiler 可以对 CPU 性能以及内存进行 profile,可以在运行时开启和关闭。

麻雀虽小,但真的是五脏俱全。

// ---------------------------------------------

  • STL
    一般情况下,STL 里有实现的功能,首选 STL(除非你真的非常清楚这里的相关实现,确定 STL 提供的实现不能满足你的要求)。
    想要了解 STL 里提供哪些功能,可以浏览/参考:
    另外,推荐一本介绍 STL 的书:C++标准库(第二版)
  • Boost
    Boost 提供的功能包罗万象。实际上,我在工作中用过的也是少数…其中不少现在已经变成了 C++ 的标准库。这里推荐两个网站,介绍 Boost 的功能/使用:
    (中文)
    (英文)
  • folly
    Folly 是 Facebook 开源的 C++ 基础库,算是对 STL 的一些不足的补充。我没有直接引用过,但是可以作为参考。
  • abseil-cpp
    Abseil-cpp 传说是非 Google 官方开源的 C++ 基础库,收集/整理了 Google 众多 C++ 开源项目的基础库。可以认为和 Facebook folly 类似。
  • gtest 和 gmock
    Gtest 是 Google 开源的 C++ 单元测试框架,可以配合 gmock 使用。
  • glog
    Google 开源的日志库。
  • protobuf
    Protobuf 是 Google 开源的序列化、反序列化库。兼容性特别好。性能也还不错。
  • leveldb
    Leveldb 是 Google 开源的一个 LSM 存储引擎,代码质量比较高,是学习 C++ 不错的参考代码。
  • rocksdb
    Rocksdb 是 Facebook 开源的一个 LSM 存储引擎,最开始基于 leveldb 修改得到的。不过现在 rocksdb 可以说是青出于蓝而胜于蓝。
  • braft
    百度开源的 Raft 算法的 C++ 实现。
  • rapidjson
    腾讯开源的 C++ json 库。
 

// ---------------------------------------------

作为嵌入式码农,首推

buildroot/buildroot​github.com

前提是你的项目可以不太在意license约束。

但实际情况是需求多变,硬件千奇百怪,很少能找到或移植成功现成的库,所以还是得自己写。业务层随项目改变,没法做成通用库,只能将common的东西抽出来,

https://github.com/gozfree/libraries​github.com

推荐给有相同需求的程序员

 

// ---------------------------------------------

第一个不知道算不算库,反正用过的都说好,tcmalloc。

第二个是3D开发里常用的工具向UI库,imgui。

第三个就是lua了。

// ---------------------------------------------

 

===================== End

 

posted @ 2019-03-22 15:32  lsgxeva  阅读(1061)  评论(0编辑  收藏  举报