stb/docs/other_libs.md
2016-08-28 10:42:22 -07:00

22 KiB

Other single-file public-domain/open source libraries with minimal dependencies

In addition to all of my libraries, there are other, similar libraries.

The following is a list of small, easy-to-integrate, portable libraries which are usable from C and/or C++, and should be able to be compiled on both 32-bit and 64-bit platforms.

Rules

  • Libraries must be usable from C or C++, ideally both
  • Libraries should be usable from more than one platform (ideally, all major desktops and/or all major mobile)
  • Libraries should compile and work on both 32-bit and 64-bit platforms
  • Libraries should use at most two files

Exceptions will be allowed for good reasons.

New libraries and corrections

See discussion after the list.

JSON Parsing

There are a lot of JSON parsers listed here. For some analysis and performance results, check out https://github.com/miloyip/nativejson-benchmark

Library listing

Public domain single-file libraries usable from C and C++ are in bold. Other libraries are either non-public domain, or two files, or not usable from both C and C++, or all three. Libraries of more than two files are mostly forbidden.

For the API column, "C" means C only, "C++" means C++ only, and "C/C++" means C/C++ usable from either; some files may require building as C or C++ but still qualify as "C/C++" as long as the header file uses extern "C" to make it work. (In some cases, a header-file-only library may compile as both C or C++, but produce an implementation that can only be called from one or the other, because of a lack of use of extern "C"; in this case the table still qualifies it as C/C++, as this is not an obstacle to most users.)

category library license API files description
AI micropather zlib C++ 2 pathfinding with A*
argv parg public domain C 1 command-line argument parsing
audio aw_ima.h MIT C/C++ 1 IMA-ADPCM audio decoder
audio dr_flac public domain C/C++ 1 FLAC audio decoder
audio dr_wav public domain C/C++ 1 WAV audio loader
audio sts_mixer public domain C/C++ 1 simple stereo audio mixer
compression miniz.c public domain C/C++ 1 compression,decompression, zip file, png writing
compression lz4 BSD C/C++ 2 fast but larger LZ compression
compression fastlz MIT C/C++ 2 fast but larger LZ compression
compression pithy BSD C/C++ 2 fast but larger LZ compression
crypto TweetNaCl public domain C 2 high-quality tiny cryptography library
data structures klib MIT C/C++ 2 many 2-file libs: hash, sort, b-tree, etc
data structures uthash BSD C/C++ 2 several 1-header, 1-license-file libs: generic hash, list, etc
data structures PackedArray WTFPLv2 C 2 memory-efficient array of elements with non-pow2 bitcount
data structures minilibs public domain C 2 two-file binary tress (also regex, etc)
data structures DG_dynarr.h public domain C/C++ 1 typesafe dynamic arrays (like std::vector) for plain C
files & filenames DG_misc.h public domain C/C++ 1 Daniel Gibson's stb.h-esque cross-platform helpers: path/file, strings
files & filenames whereami WTFPLv2 C/C++ 2 get path/filename of executable or module
files & filenames noc_file_dialog.h MIT C/C++ 1 file open/save dialogs (Linux/OSX/Windows)
files & filenames dirent MIT C/C++ 1 dirent for windows: retrieve file & dir info
files & filenames TinyDir BSD C 1 cross-platform directory reader
geometry file tk_objfile MIT C/C++ 1 OBJ file loader
geometry file tinyply public domain C++ 2 PLY mesh file loader
geometry file tinyobjloader MIT C++ 1 wavefront OBJ file loader
geometry file tinyobjloader-c MIT C 1 wavefront OBJ file loader
geometry file yocto_obj.h MIT C/C++ 1 wavefront OBJ file loader
geometry math nv_voronoi.h public domain C/C++ 1 find voronoi regions on lattice w/ integer inputs
geometry math sobol.h public domain C/C++ 1 sobol & stratified sampling sequences
geometry math sdf.h MIT C/C++ 1 compute signed-distance field from antialiased image
geometry math nanoflann BSD C++ 1 build KD trees for point clouds
geometry math jc_voronoi MIT C/C++ 1 find voronoi regions on float/double data
geometry math par_msquares MIT C/C++ 1 convert (binarized) image to triangles
geometry math par_shapes MIT C/C++ 1 generate various 3d geometric shapes
geometry math Tomas Akenine-Moller snippets public domain C/C++ 2 various 3D intersection calculations, not lib-ified
geometry math Clipper Boost C++ 2 line & polygon clipping & offsetting
geometry math PolyPartition MIT C++ 2 polygon triangulation, partitioning
geometry math Voxelizer MIT C/C++ 1 convert triangle mesh to voxel triangle mesh
geometry math yocto_bvh.h MIT C/C++ 1 ray-casting and closest-element queries of bounding-volume hierarchy
geometry math yocto_shape.h MIT C/C++ 1 shape generation, tesselation, normals, etc.
graphics (3d) yocto_trace.h MIT C/C++ 1 physically-based unidirectional path tracer w/ MIS for direct lights
graphics (3d) yocto_symrigid.h MIT C/C++ 1 rigid body simulator (sequential impulse/PGS) with support for concave objects
graphics (2d) blendish MIT C/C++ 1 blender-style widget rendering
graphics (2d) tigr public domain C/C++ 2 quick-n-dirty window text/graphics for Windows and OSX
graphics (2d) noc_turtle MIT C/C++ 2 procedural graphics generator
graphics (3-D) mikktspace zlib C/C++ 2 compute tangent space for normal mapping
graphics (3-D) debug-draw public domain C++ 1 API-agnostic immediate-mode debug rendering
graphics (3-D) lightmapper public domain C/C++ 1 use your OpenGL renderer to offline bake lightmaps
hardware EasyTab public domain C/C++ 1 multi-platform tablet input
images jo_gif.cpp public domain C++ 1 animated GIF writer (CPP file can also be used as H file)
images gif.h public domain C 1 animated GIF writer (can only include once)
images tiny_jpeg.h public domain C/C++ 1 JPEG encoder
images miniexr public domain C++ 2 OpenEXR writer, needs header file
images tinyexr BSD C/C++ 1 EXR image read/write, uses miniz internally
images lodepng zlib C/C++ 2 PNG encoder/decoder
images nanoSVG zlib C/C++ 1 1-file SVG parser; 1-file SVG rasterizer
images picopng.cpp zlib C++ 2 tiny PNG loader
images jpeg-compressor public domain C++ 2 2-file jpeg compress, 2-file jpeg decompress
images easyexif MIT C++ 2 EXIF metadata extractor for JPEG images
images cro_mipmap.h public domain C/C++ 1 average, min, max mipmap generators
math mm_vec.h BSD C/C++ 1 SIMD vector math
math Handmade Math public domain C/C++ 1 vector math
math gb_math public domain C/C++ 1 Vector, quaternion and matrix math w/o math.h
math ccVector.h public domain C/C++ 1 Vector, quaternion and matrix math
math ShaderFastLibs MIT C++ 1 (also HLSL) approximate transcendental functions optimized for shaders (esp. GCN)
math TinyExpr zlib C 2 evaluation of math expressions from strings
math linalg.h unlicense C++ 1 vector/matrix/quaternion math
math PoissonGenerator.h MIT C++ 1 Poisson disk points generator (disk or rect)
math prns.h public domain C/C++ 1 seekable pseudo-random number sequences
math **aomeba MIT C/C++ 1 constraint solver (Cassowary) w/Lua binding
multithreading mm_sched.h zlib C/C++ 1 cross-platform multithreaded task scheduler
network zed_net public domain C/C++ 1 cross-platform socket wrapper
network sts_net public domain C/C++ 1 cross-platform socket wrapper (socket sets and packet API)
network mm_web.h BSD C/C++ 1 lightweight webserver, fork of webby
network par_easycurl.h MIT C/C++ 1 curl wrapper
network yocto public domain C/C++ 2 non-production-use http server
network happyhttp zlib C++ 2 http client requests
network mongoose GPLv2 C/C++ 2 http server
network LUrlParser MIT C++ 2 lightweight URL & URI parser RFC 1738, RFC 3986
network znet MIT C/C++ 1 cross-platform networking w/ lua binding
parsing SLRE GPLv2 C/C++ 1 regular expression matcher
parsing PicoJSON BSD C++ 1 JSON parse/serializer
parsing mm_lexer.h zlib C/C++ 1 C-esque language lexer
parsing json.h public domain C/C++ 2 JSON parser
parsing jzon.h MIT C++ 2 JSON parser
parsing parson MIT C/C++ 2 JSON parser and serializer
parsing minilibs public domain C 2 two-file regex (also binary tree, etc)
profiling Remotery Apache 2.0 C/C++ 2 CPU/GPU profiler Win/Mac/Linux, using web browser for viewer
profiling MicroProfile unlicense C++ 2-4 CPU (and GPU?) profiler, 1-3 header files, uses miniz internally
scripting LIL zlib C/C++ 2 interpreter for a Tcl-like scripting language
scripting lualite MIT C++ 1 generate lua bindings in C++
scripting Picol BSD C/C++ 1 interpreter for a Tcl-like scripting language
strings DG_misc.h public domain C/C++ 1 Daniel Gibson's stb.h-esque cross-platform helpers: path/file, strings
strings utf8 public domain C/C++ 1 utf8 string library
strings strpool.h public domain C/C++ 1 string interning
strings dfa MIT C/C++ 2 fast utf8 decoder (need a header file)
strings gb_string.h public domain C/C++ 1 dynamic strings
tests utest MIT C/C++ 1 unit testing
tests catch Boost C++ 1 unit testing
tests SPUT BSD C/C++ 1 unit testing
tests pempek_assert.cpp WTFPLv2 C++ 2 flexible assertions
tests minctest zlib C 1 unit testing
tests greatest iSC C 1 unit testing
tests µnit MIT C 1 unit testing
user interface dear imgui MIT C++ 9 an immediate-mode GUI formerly named "ImGui"; 3rd-party C wrapper
user interface nuklear public domain C/C++ 1 minimal GUI toolkit
misc MakeID.h public domain C++ 1 allocate/deallocate small integer IDs efficiently
misc loguru public domain C++ 1 flexible logging
misc tinyformat Boost C++ 1 typesafe printf
misc dbgtools zlib C/C++ 2 cross-platform debug util libraries
misc stmr MIT C 2 extract English word stems
misc levenshtein MIT C 2 compute edit distance between two strings

There are also these XML libraries, but if you're using XML, shame on you:

Also you might be interested in other related, but different lists:

  • clib: list of (mostly) small single C functions (licenses not listed)

New libraries and corrections

Submissions of new libraries: I accept submissions (as issues or as pull requests). Please note that every file that must be included in a user's project counts; a header and a source file is 2 files, but a header file, source file, and LICENSE (if the license isn't in the source file) is 3 files, and won't be accepted, because it's not 2 files. But actually 'LICENSE' is a problem for just dropping the library in a source tree anyway, since it's not scoped to just the library, so library authors are encouraged to include the license in the source file and not require a separate LICENSE.

Corrections: if information for a library above is wrong, please send a correction as an issue, pull request, or email. Note that if the list indicates a library works from both C/C++, but it doesn't, this could be an error in the list or it could be a bug in the library. If you find a library doesn't work in 32-bit or 64-bit, the library should be removed from this list, unless it's a bug in the library.

List FAQ

Yes, you can just use this page. If you want a shorter, more readable link, you can use this URL to link to the FAQ question that links to this page.

Why isn't library XXX which is made of 3 or more files on this list?

I draw the line arbitrarily at 2 files at most. (Note that some libraries that appear to be two files require a separate LICENSE file, which made me leave them out). Some of these libraries are still easy to drop into your project and build, so you might still be ok with them. But since people come to stb for single-file public domain libraries, I feel that starts to get too far from what we do here.

Why isn't library XXX which is at most two files and has minimal other dependencies on this list?

Probably because I don't know about it, feel free to submit a pull request, issue, email, or tweet it at me (it can be your own library or somebody else's). But I might not include it for various other reasons, including subtleties of what is 'minimal other dependencies' and subtleties about what is 'lightweight'.

Why isn't SQLite's amalgamated build on this list?

Come on.