C/C++ 程序库
C/C++ 程序库
// ---------------------------------------------
来几个不常见但是很变态的库吧:
bundle: 把几乎所有常见的压缩库封装成了一个库, 接口完全统一, 想用哪个用哪个.
就一个h和一个巨TM大的cpp文件,巨好使巨方便.
Celero: 简单清晰的benchmark库, 特点就是简单易用没有废话.
getopt: 解析命令行输入参数的库, 好使! 没废话! 就俩文件.
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. 代码有深度且可读性高,可以挖宝贝
- 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
// ---------------------------------------------
做存储, 数据库系统方面的开发,主要用到
* 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是一个数据库服务,并不是单独的库,但其代码精简,质量非常高,里面很多代码都可以拿出来直接复用,比如网络,各种数据结构的实现。
// ---------------------------------------------
// ---------------------------------------------
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++著名程序库的比较和学习经验 - CSDN博客,转载请注明。
// ---------------------------------------------
- 应用开发框架Qt,我的最爱,我还写了两本相关的书,《Qt Quick核心编程》和《Qt on Android核心编程》。优雅的信号与槽,强大的界面类库,跨平台。
- CEF(Chromium Embedded Framework),使用网页做富客户端的绝佳选择,基于Chromium,可以方便嵌入到你的应用中。类似的还有 Electron 。
- WebRTC,非常赞的框架,做音视频通信绕不开的。
- TinyXml,小巧的C++ XML库,几个源文件,直接加入到项目中就可以用
- Protobuf,Google的,网络通信,非常赞,方便序列化和结构化,流量又小
- FreeImage,强大好用的图形库
- Libevent,轻量级的基于事件驱动的高性能的开源网络库
- ffmpeg,多媒体开发类库的无冕之王
// ---------------------------------------------
curl
zlib
sqlite
opencv
// ---------------------------------------------
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
不多解释了,两种不同类型的并行计算模型。
// ---------------------------------------------
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类型需要一堆恶心的宏)。
// ---------------------------------------------
我推荐一个貌似没被提及的:https://github.com/Taywee/args。
用于解析命令行参数,个人觉得比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 里提供哪些功能,可以浏览/参考: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 库。
// ---------------------------------------------
作为嵌入式码农,首推
buildroot/buildrootgithub.com
前提是你的项目可以不太在意license约束。
但实际情况是需求多变,硬件千奇百怪,很少能找到或移植成功现成的库,所以还是得自己写。业务层随项目改变,没法做成通用库,只能将common的东西抽出来,
https://github.com/gozfree/librariesgithub.com
推荐给有相同需求的程序员
// ---------------------------------------------
第一个不知道算不算库,反正用过的都说好,tcmalloc。
第二个是3D开发里常用的工具向UI库,imgui。
第三个就是lua了。
// ---------------------------------------------
===================== End
C/C++ 程序库的更多相关文章
- 使用Spire.Barcode程序库生成二维码
使用Spire.Barcode程序库生成二维码 某天浏览网页发现了一个二维码的程序库.它的描述说他可以扫描二维码图像.我很感兴趣,想试试他是不是会有用.所以我就用了些方法扫描二维码图像来测试一下.结果 ...
- Windows2003系统问题:“无法加载安装程序库wbemupgd.dll,或是找不到函数OcEntry.
“无法加载安装程序库wbemupgd.dll,或是找不到函数OcEntry.请与您的系统管理员联系.特定错误码是 0x7e;" 然后是警告框: " 无法初始化应用程序." ...
- 算法库:基础线性代数子程序库(Basic Linear Algebra Subprograms,BLAS)介绍
调试DeepFlow光流算法,由于作者给出的算法是基于Linux系统的,所以要在Windows上运行,不得不做大量的修改工作.移植到Windows平台,除了一些头文件找不到外,还有一些函数也找不到.这 ...
- 【M23】考虑使用其他程序库
1.程序库的设计是一种权衡的结果.体积小,速度快往往不能移植.可移植,通用的程序库往往意味着冗余和效率低下. 2.因此,选择程序库的时候,需要进行取舍.比如:iostream和stdio.iostre ...
- QT程序库
实际上,QT不仅仅是一个巨大的程序库,而是7个程序库,还包括许多使用工具,qmake是其中的一个.如今,术语GUI工具包代表的东西的用途不再仅仅是系统提供的那么一个小部分(GUI界面).尤其是QT ...
- MCS-51单片机实用子程序库
目前已有若干版本的子程序库公开发表,它们各有特色.本程序库中的开平方算法为快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度. 本子程序库对<单片机应用程 ...
- .NET自动字符编码识别程序库 NChardet
什么是NChardet NChardet是mozilla自动字符编码识别程序库chardet的.NET实现,它移植自jchardet,chardet的java版实现,可实现对给定字符流的编码探测. N ...
- Boost程序库完全开发指南——深入C++“准”标准库(第3版)
内容简介 · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Bo ...
- 【转】介绍几个图论和复杂网络的程序库 —— BGL,QuickGraph,igraph和NetworkX
原文来自:http://blog.sciencenet.cn/blog-404069-297233.html 作复杂网络研究离不开对各种实际或模拟网络的统计.计算.绘图等工作.对于一般性的工作,我们可 ...
随机推荐
- VS2012添加数据库连接时报错,未能加载文件或程序集microsoft.sqlserver.management.sdk.sfc
今天在VS2012中添加数据库连接时报错 未能加载文件或程序集microsoft.sqlserver.management.sdk.sfc,Version=11.0 查了很多资料,最后下载安装了Sha ...
- Python-SMTP发送邮件(HTML、图片、附件)
前言: SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. 一.Python发送HTML ...
- H5 颜色属性
07-颜色属性 我是段落 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- HNOI2013 BZOJ3144 切糕
在n×m的表格上,在(x,y)填v的代价是w(x,y,v),且相邻格子填的数相差≤d.求填满表格的最小代价.n,m,maxv≤40. 每个点上选择一个数填,因此将上面的数串起来.考虑限制条件,矛盾条件 ...
- 史上最全 原生javascript的知识总结,适合新手及查资料用!
适合右键另存为图片保存,再放大看!
- JS闭包以及作用域初探
以前看到的一个问题,很有意思: for (var i = 0; i < 5; i++) { setTimeout(function () { console.log(i); },500); } ...
- 学习yii2.0——行为
学习yii框架的行为之前,需要先了解yii的事件,可以参考这篇博客: 怎么理解行为 yii框架的行为有点类似于trait,可以有个大体的概念: 1.有一个类A,包含一些属性和方法,很普通的一个类A. ...
- MySQL 主从同步遇到的问题及解决方案
在做某个项目的时候,使用主从数据库,master负责update.delete.insert操作,而slave负责select操作. 情景1:发表文章与查看文章 可以认为这个项目是一个博客系统,这里就 ...
- js 深度复制deepClone
function isObject(obj) { return typeof obj === 'object' && obj != null; } const deepClone =( ...
- Windows BAT 命令下del 与 rd 命令
https://blog.csdn.net/jigetage/article/details/81180757 RD 与 DEL 命令 windows bat 目录和文件的删除处理. 命令:RD,删除 ...