C/C++ 程序庫

C/C++ 程序庫

 

// ---------------------------------------------php

來幾個不常見可是很變態的庫吧:html

 

bundle: 把幾乎全部常見的壓縮庫封裝成了一個庫, 接口徹底統一, 想用哪一個用哪一個.前端

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

r-lyeh-archived/bundlepython

 

Celero: 簡單清晰的benchmark庫, 特色就是簡單易用沒有廢話.linux

DigitalInBlue/Celeroios

 

getopt: 解析命令行輸入參數的庫, 好使! 沒廢話! 就倆文件.c++

r-lyeh-archived/getoptgit

 

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++ 開發圖形化界面的應用是很是難的,須要寫一大長串的不明因此的代碼,直到遇到這個庫

項目官網

 

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

寫幾個我最常常用的吧:

一、科學家算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:

二、最優化工具包,NLopt:NLopt Reference

通常簡單問題GSL的最優化包也夠用了,不過若是碰到有約束之類的問題,NLopt包是個不錯的選擇。

三、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

相關文章
相關標籤/搜索