// ---------------------------------------------php
来几个不常见可是很变态的库吧:html
bundle: 把几乎全部常见的压缩库封装成了一个库, 接口彻底统一, 想用哪一个用哪一个.前端
就一个h和一个巨TM大的cpp文件,巨好使巨方便.node
r-lyeh-archived/bundlepython
Celero: 简单清晰的benchmark库, 特色就是简单易用没有废话.linux
getopt: 解析命令行输入参数的库, 好使! 没废话! 就俩文件.c++
stb_image: 常见图片格式加载库, 就一个巨大无比的头文件程序员
stb_truetype: 常见字体加载库, 就一个巨大无比的头文件, 以为freetype大的能够用它.
都在这: nothings/stb
better-enums: 编译期实现的enum扩展功能,包括enum和字符串互转等等. 感受比较重量级, 我通常是不用的, 但有时候没它还真是别扭, 尤为是须要把一个enum序列化的时候.
Catch2: 著名的单元测试框架, 那么它和boost或者google的单元测试框架有什么不一样呢?
就在于它首先是header only的, 其次是没有废话,直击要害! 你要测试对吧? 给你!
uchardet: 实现猜字符串编码的功能, 例如输入一个不知道编码的文本文件, 它能够帮你"猜" 这个文件的编码是什么. 和python里的uchardet功能基本同样.
win-iconv: iconv库是一个字符集编码转换的库, 在linux和mac下均是原生字符转换库. 但windows上并非自带的. 那么就会致使在windows上编译iconv有点浪费. 由于windows显然已经自带字符集转换的功能了. 那么这个库的做用就是用windows api来实现和iconv库如出一辙的接口. 这样编译出来比较小. 今后字符转换不是梦.
freetype-gl: open gl 上实现的freetype. 不过我我的没用过... 不知道好很差用. 但当你须要在opengl上下文中渲染字体的时候, 你可能用得着它.
nanovg: 基于openGL/DX/metal的2d绘图库. 绘图效率高, 接口清晰. 主版本是基于openGL的, 但有DX,metal等分支. 前端接口还有python和lua的. 我的感受不错.
imgui: 大名鼎鼎的imgui, 你可能会问在有一堆GUI框架的状况下为何咱们须要imgui? 由于它是immediate mode的. 我的认为是几个immediate mode的GUI框架里最好的. 详细见它的页面介绍.
spdlog: logger库, 重点推荐! 为何呢? 由于好使! 没有废话. 并且是header only的.
ffts: 很好使的FFT库, 和fftw的不一样在于用着是真方便! 并且难能难得在于速度竟然真不比fftw慢.
fmt: formatting库, 又小又好使! 太好使了!
最后是恐怖的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了.
//--------------------------------------------------
再补充几个吧:
上面说的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都有. 我不怎么搞这方面, 也不知道好很差使, 我只是以为很牛就放这里了:
scriptorium: 这个就不算是库了, 是几乎全部你据说过的没据说过的常见用于游戏脚本的语言的benchmark, 能够不去研究, 但不妨看看:
tinyexpr: 我特别喜欢的数学表达式解析和计算库, 真的好用并且小, 专门用来实如今程序运行时解析用户输入的数学表达式并作计算的库, 只有两个文件, 往项目里一拖就好了:
matplotcpp: 在C++中绑定python的matplot库.
// ---------------------------------------------
A. 本身写一遍太累
B. 写得很好
C. 实用且知足个人需求
D. 好用不折腾
E. 代码有深度且可读性高,能够挖宝贝
Update: 再加两个没人提的
// ---------------------------------------------
作存储, 数据库系统方面的开发,主要用到
* grpc/libevent/libev/libasio 实现高性能网络服务器
// ---------------------------------------------
// ---------------------------------------------
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