漢は黙ってシングルファイル C/C++ ライブラリですね!
シングルファイル C/C++ ライブラリとは, ヘッダファイル .h ひとつだけで機能が実装されているライブラリ(もう少し条件をゆるくして .cc も含む)のことです. header-only とも言われれたりします.
このあたりの元祖は nothings 先生 http://nothings.org/ ですね. 最近は github にコードをあげています.
シングルファイル系のライブラリまとめ一覧もあります.
シングルファイル系が便利すぎてやばいので, 自分でもいくつか作りました.
- TinyObjloader(Wavefront .obj loader) https://github.com/syoyo/tinyobjloader
- TinyEXR(OpenEXR loader/saver) https://github.com/syoyo/tinyexr
- NanoRT(ray tracer) https://github.com/lighttransport/nanort
- ESON(Schema-less binary serialize/deserialize) https://github.com/syoyo/eson
- TinyGLTF https://github.com/syoyo/tinygltf
特に, TinyObjLoader は昨今のモバイル 3D ゲームや 3D プリント人気にあやかり(?) cocos2d-x に使われていたりと自分史上最も github でスター数が多いライブラリになっています. ありがとうございます.
なぜシングルファイルか
昨今は多様な OS(Windows, Linux, Mac, iOS/Android, Solaris, etc)や, 多様なデバイス(x86, ARM, MIPS, SPARC, etc)でアプリを動かす必要性が出てきたり, node.js などでちょっと処理が重い部分を C/C++ でネイティブ化したり, アイデアをぱぱっと実装したり, 簡単なデータコンバータを作りたいなどの要求が多く出てきています.
そのような状況では, シングルファイル系に大きな利点があります.
- コンパイルが簡単(configure とかしなくてよい). Makefile などにファイルを追加するだけで使える.
- ライブラリ間の依存関係が無い
- boost に依存していてまず boost をビルドするところから... という問題が無い.
- ライブラリ依存関係が無い(もしくは最低限)のため, ライブラリ間の依存関係でバージョン違いなどのビルドエラー, リンクエラーという問題も無い
- システムにインストールされているライブラリと干渉しない.
- 組み込んで扱いやすいライセンス(BSD, MIT, public domain, etc)
シングルヘッダベストテン
https://github.com/nothings/stb/blob/master/docs/other_libs.md まとめ一覧をふくめ, 独断で俺得なシングルファイル系ライブラリのおすすめ top 10 を選んでみました.
- STB image(画像ローダ)
- STB image write(画像セーバ)
- STB image resize(画像リサイズ)
- Duktape(JavaScript interpreter) http://duktape.org/
- TinyObjLoader(wavefront .obj loader)
- HappyHTTP(http client)
- PicoJSON(JSON parser)
- easywsclient(WebSocket client) https://github.com/dhbaird/easywsclient
- MicroProfile(Profiling) https://github.com/zeux/microprofile
- NanoVG/NanoSVG(ベクターグラフィックス)
ほしいもの
まだ未開拓な領域. これを実装したらヒーローになれます!
- YAML parser
- http/2 server/client(BSD or MIT license)
- => きたかも!? > https://github.com/yhirose/cpp-httplib
ヘッダーオンリー
1 ヘッダファイルではありませんが, 複数ヘッダファイルでも素晴らしいものがあります.
- tiny-dnn(Deep learning library) https://github.com/tiny-dnn/tiny-dnn
まとめ
github によるソーシャルコーディングのムーブメントもあって, 各種シングルファイル系の流行りが出てきている予感あります(機能が制限されているので, プルリクやバグレポもやりやすい).
そして..., シングルファイル C/C++ ライブラリはたのしい!
TODO
- もう少ししっくりくる名称は無いかな?