C/C++ 常用程序库_better_enum-程序员宅基地

技术标签: c++  c语言  入门到入土系列  开发语言  

C/C++ 程序库

https://zhuanlan.zhihu.com/p/98056565

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

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

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实现复杂了一点, 这个更简单:

https://github.com/win-iconv/win-iconv

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

https://github.com/marton78/pffft

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

编辑于 2018-12-02

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

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

AC: 3D 模型解析 assimp/assimp
ACE: 物理模拟 bulletphysics/bullet3
AB: 渲染中间层 bkaradzic/bgfx
CD: 3D灵感宣泄场所 cinder/Cinder // 后来发现 Houdini 更好玩
CD: 命令行帮助既是命令行解析 https://github.com/docopt/docopt.cpp
ACD: printf 不好用,ostream 也不好用,format 好用 fmtlib/fmt
ABCD: 3D 数学运算 g-truc/glm
ABCD: 拿来就能用的 UI ocornut/imgui
D: json 结构用在 C++ 里面就像在 JS 里面一样自然 nlohmann/json
BCD: 超高校级的 json 解析 Tencent/rapidjson
ABCD: 用过都知道它的好的性能分析工具 jonasmr/microprofile
CD: 又快又不折腾的 xml 解析 zeux/pugixml
ACD: 专注寻路 recastnavigation/recastnavigation
ACD: 什么都能放到头文件中 nothings/stb
D: 一键生成 C/C++ 对各种其他语言的接口 swig/swig
ACD: 最快的哈希算法 Cyan4973/xxHash
E: 包含大量计算几何算法的 Geometric Tools
E: 包含最经典渲染算法的 mmp/pbrt-v3

Update: 再加两个没人提的

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

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

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

  • 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是一个数据库服务,并不是单独的库,但其代码精简,质量非常高,里面很多代码都可以拿出来直接复用,比如网络,各种数据结构的实现。
    编辑于 2018-05-10

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

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

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

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++ Library:P.J.Plauger编写的高品质的标准库,值得一提的是,其编写的库长期被Microsoft采用。
RogueWave Standard C++ Library:这个库在Borland C++ Builder的早期版本中曾经被采用,后来被其他的库给替换了。
SGI STL:SGI公司的C++标准模版库。
STLport:SGI 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。

网络通信
ACE:C++库的代表,超重量级的网络通信开发框架,可跨越多种平台完成通用的通信软件任务。
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 的本质。
cJSON:C语言中的一个JSON编解码器,非常轻量级,速度非常理想。结构简单易懂,可以作为一个非常好的C语言项目进行学习。
CMockery:Google发布的用于C单元测试的一个轻量级的框架。它很小巧,对其他开源包没有依赖,对被测试代码侵入性小。
Libev:基于Reactor模式,效率较高,并且代码精简,是学习事件驱动编程的很好的资源。
Memcached:Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。
Lua:在任何支持ANSI C编译器的平台上都可以轻松编译通过。
SQLite:SQLite是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。
NETBSD:NetBSD是一个免费的,具有高度移植性的 UNIX-like 操作系统,是现行可移植平台最多的操作系统。

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

编辑于 2019-01-15

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

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

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

自己最常用的几个:
curl
zlib
sqlite
opencv
发布于 2017-01-11

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

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

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

项目官网 http://nanapro.org/en-us/

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

写几个我最经常用的吧:

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:https://software.intel.com/en-us/intel-mkl/

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

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

3、OpenMP、OpenMPI

不多解释了,两种不同类型的并行计算模型。
发布于 2016-10-01

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

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,了却找第三方库,编译第三方库的烦恼。

编辑于 2019-01-16

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

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

tinyxml2,用来解析xml的。

发布于 2019-01-12

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

说几个跟化学相关的:

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

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

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

编辑于 2017-01-17

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

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

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

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

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

大数字运算库GMP

计算机视觉库OpenCV,大学时玩过,不是一般的nb
编辑于 2017-01-18

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

GLib

FFmpeg

fftw

boost

Catch2

libuv

http_parser

OpenSSL

libsodium

MsgPack

cblas

SQLite

Redis

cJSON

编辑于 2018-05-10

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

我来布道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类型需要一堆恶心的宏)。

发布于 2018-05-10

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

我推荐一个貌似没被提及的:https://github.com/Taywee/args。

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

发布于 2018-05-10

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

  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,现在想到的就有这些,以后补充。。。

编辑于 2017-06-01

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

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

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

发布于 2019-01-20

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

STL
一般情况下,STL 里有实现的功能,首选 STL(除非你真的非常清楚这里的相关实现,确定 STL 提供的实现不能满足你的要求)。
想要了解 STL 里提供哪些功能,可以浏览/参考:https://en.cppreference.com/w/。
另外,推荐一本介绍 STL 的书:C++标准库(第二版)。
Boost
Boost 提供的功能包罗万象。实际上,我在工作中用过的也是少数…其中不少现在已经变成了 C++ 的标准库。这里推荐两个网站,介绍 Boost 的功能/使用:
http://zh.highscore.de/cpp/boost/frontpage.html(中文)
https://theboostcpplibraries.com/(英文)
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 库。
发布于 2019-01-25

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

作为嵌入式码农,首推

buildroot/buildroot​github.com
前提是你的项目可以不太在意license约束。

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

https://github.com/gozfree/libraries​github.com
推荐给有相同需求的程序员

编辑于 2019-01-05

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

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

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

第三个就是lua了。

发布于 2019-02-07

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Jason_Chen__/article/details/123475323

智能推荐

攻防世界_难度8_happy_puzzle_攻防世界困难模式攻略图文-程序员宅基地

文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文

达梦数据库的导出(备份)、导入_达梦数据库导入导出-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作  导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释:   cwy_init/init_123..._达梦数据库导入导出

js引入kindeditor富文本编辑器的使用_kindeditor.js-程序员宅基地

文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6

计算机网络-数据链路层_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输

软件测试工程师移民加拿大_无证移民,未受过软件工程师的教育(第1部分)-程序员宅基地

文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...

随便推点

Thinkpad X250 secure boot failed 启动失败问题解决_安装完系统提示secureboot failure-程序员宅基地

文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure

C++如何做字符串分割(5种方法)_c++ 字符串分割-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割

2013第四届蓝桥杯 C/C++本科A组 真题答案解析_2013年第四届c a组蓝桥杯省赛真题解答-程序员宅基地

文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答

基于供需算法优化的核极限学习机(KELM)分类算法-程序员宅基地

文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。

metasploitable2渗透测试_metasploitable2怎么进入-程序员宅基地

文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf

推荐文章

热门文章

相关标签