// ---------------------------------------------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