single_file_libs/README.md

36 KiB

Single-file public-domain/open source libraries with minimal dependencies

I am the author of a large number of single-file C/C++ public domain libraries. I am not the only person who writes libraries like this, so below are other, similar libraries.

Generally, 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. However, I have not personally verified that any specific lilbrary is as advertised, or is quality software.

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.

Recent Additions

category library license API files description
audio tinysound zlib C/C++ 1 direct sound audio mixer & WAV loader
argv flags public domain C++ 1 command-line argument parsing
argv optionparser MIT C++ 1 command-line argument parsing
data struct libpqueue BSD C/C++ 2 priority queue (heap)
files tinyfiles zlib C/C++ 1 cross-platform directory reading (win/mac/unix)
geometry df public domain C/C++ 1 find voronoi region in linear time of size of lattice
graphs simrank.hpp MIT C++ 2 SimRank graph similarity algorithm
hardware libue MIT C/C++ 1 Helper library for Linux device hot-plug event
images TinyEXIF BSD C++ 2 Parse EXIF data from JPEG (XMP w/ TinyXML2 lib)
json json.hpp MIT C++ 1 JSON parse, serialize, deserialize
network EWS BSD C/C++ 1 http server
parsing tinymemfile zlib C++ 1 fscanf on in-memory files
parsing inih BSD C/C++ 2 .ini file parser
profiling prof MIT C/C++ 1 profiler for Linux
scripting s7 BSD C/C++ 2 interpreter for a subset of Scheme (R5RS/R7RS)
UI linenoise BSD C/C++ 2 terminal readline w/ history etc
vector algebra3.h public domain C++ 1 vector utilities for 2, 3, and 4 element vectors, all inline
vector linalg ISC C/C++ 1 vector/matrix/quaternion math
misc tinytime zlib C/C++ 1 quick-and-dirty time elapsed time
misc visit_struct Boost C++ 2 struct-field reflection
testing hippomocks LGPL C++ 1 unit testing
testing fctx BSD C/C++ 1 unit testing

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

Other lists

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

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

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.)

Categories:

AI

library license API files description
micropather zlib C++ 2 pathfinding with A*
Genann zlib C/C++ 2 simple neural networks (ANN)

argv

library license API files description
parg public domain C 2 command-line argument parsing
flags public domain C++ 1 command-line argument parsing
optionparser MIT C++ 1 command-line argument parsing

audio

library license API files description
aw_ima.h MIT C/C++ 1 IMA-ADPCM audio decoder
dr_flac public domain C/C++ 1 FLAC audio decoder
dr_wav public domain C/C++ 1 WAV audio loader
sts_mixer public domain C/C++ 1 simple stereo audio mixer
tinysound zlib C/C++ 1 direct sound audio mixer & WAV loader

compression

library license API files description
miniz.c public domain C/C++ 1 compression,decompression, zip file, png writing
lz4 BSD C/C++ 2 fast but larger LZ compression
fastlz MIT C/C++ 2 fast but larger LZ compression
pithy BSD C/C++ 2 fast but larger LZ compression
microtar MIT C/C++ 2 lightweight tar library

crypto

library license API files description
TweetNaCl public domain C 2 high-quality tiny cryptography library

data structures

library license API files description
klib MIT C/C++ 2 many 2-file libs: hash, sort, b-tree, etc
uthash BSD C/C++ 2 several 1-header, 1-license-file libs: generic hash, list, etc
PackedArray WTFPLv2 C 2 memory-efficient array of elements with non-pow2 bitcount
minilibs public domain C 2 two-file binary tress (also regex, etc)
DG_dynarr.h public domain C/C++ 1 typesafe dynamic arrays (like std::vector) for plain C
chobo-shl MIT C++ 1 several C++11 standard contaner like libraries and helpers
libpqueue BSD C/C++ 2 priority queue (heap)

debugging

library license API files description
loguru public domain C++ 1 flexible logging
pempek_assert.cpp WTFPLv2 C++ 2 flexible assertions
debug-assert zlib C++ 1 modular assertion macro
dbgtools zlib C/C++ 2 cross-platform debug util libraries

files & filenames

library license API files description
DG_misc.h public domain C/C++ 1 Daniel Gibson's stb.h-esque cross-platform helpers: path/file, strings
whereami WTFPLv2 C/C++ 2 get path/filename of executable or module
dirent MIT C/C++ 1 dirent for windows: retrieve file & dir info
TinyDir BSD C 1 cross-platform directory reading (win/posix/mingw)
tinyfiles zlib C/C++ 1 cross-platform directory reading (win/mac/unix)

#geometry file

library license API files description
tk_objfile MIT C/C++ 1 OBJ file loader
tinyply public domain C++ 2 PLY mesh file loader
tinyobjloader MIT C++ 1 wavefront OBJ file loader
tinyobjloader-c MIT C 1 wavefront OBJ file loader
yocto_obj.h MIT C/C++ 1 wavefront OBJ file loader

#geometry math

library license API files description
nv_voronoi.h public domain C/C++ 1 find voronoi regions on lattice w/ integer inputs
df public domain C/C++ 1 find voronoi region in linear time of size of lattice
sobol.h public domain C/C++ 1 sobol & stratified sampling sequences
sdf.h MIT C/C++ 1 compute signed-distance field from antialiased image
nanoflann BSD C++ 1 build KD trees for point clouds
jc_voronoi MIT C/C++ 1 find voronoi regions on float/double data
par_msquares MIT C/C++ 1 convert (binarized) image to triangles
par_shapes MIT C/C++ 1 generate various 3d geometric shapes
Tomas Akenine-Moller snippets public domain C/C++ 2 various 3D intersection calculations, not lib-ified
Clipper Boost C++ 2 line & polygon clipping & offsetting
PolyPartition MIT C++ 2 polygon triangulation, partitioning
Voxelizer MIT C/C++ 1 convert triangle mesh to voxel triangle mesh
yocto_bvh.h MIT C/C++ 1 ray-casting and closest-element queries of bounding-volume hierarchy
yocto_shape.h MIT C/C++ 1 shape generation, tesselation, normals, etc.
rjm public domain C/C++ 1 marching cubes triangulator

#graphics (2d)

library license API files description
blendish MIT C/C++ 1 blender-style widget rendering using NanoVG
tigr public domain C/C++ 2 quick-n-dirty window text/graphics for Windows and OSX
noc_turtle MIT C/C++ 2 procedural graphics generator

#graphics (3d)

library license API files description
yocto_trace.h MIT C/C++ 1 physically-based unidirectional path tracer w/ MIS for direct lights
yocto_symrigid.h MIT C/C++ 1 rigid body simulator (sequential impulse/PGS) with support for concave objects
mikktspace zlib C/C++ 2 compute tangent space for normal mapping
debug-draw public domain C++ 1 API-agnostic immediate-mode debug rendering
lightmapper public domain C/C++ 1 use your OpenGL renderer to offline bake lightmaps

#hardware

library license API files description
EasyTab public domain C/C++ 1 multi-platform tablet input
libue MIT C/C++ 1 Helper library for Linux device hot-plug event

#images

library license API files description
jo_gif.cpp public domain C++ 1 animated GIF writer (CPP file can also be used as H file)
gif.h public domain C++ 1 animated GIF writer (can only include once)
tiny_jpeg.h public domain C/C++ 1 JPEG encoder
gif_load public domain C/C++ 1 (animated) GIF reader
miniexr public domain C++ 2 OpenEXR writer, needs header file
tinyexr BSD C/C++ 1 EXR image read/write, uses miniz internally
lodepng zlib C/C++ 2 PNG encoder/decoder
nanoSVG zlib C/C++ 1 1-file SVG parser; 1-file SVG rasterizer
picopng.cpp zlib C++ 2 tiny PNG loader
jpeg-compressor public domain C++ 2 2-file jpeg compress, 2-file jpeg decompress
easyexif MIT C++ 2 EXIF metadata extractor for JPEG images
TinyEXIF BSD C++ 2 Parse EXIF data from JPEG (XMP w/ TinyXML2 lib)
cro_mipmap.h public domain C/C++ 1 average, min, max mipmap generators
PDFgen public domain C 2 PDF writer

#math

library license API files description
ShaderFastLibs MIT C++ 1 (also HLSL) approximate transcendental functions optimized for shaders (esp. GCN)
TinyExpr zlib C 2 evaluation of math expressions from strings
PoissonGenerator.h MIT C++ 1 Poisson disk points generator (disk or rect)
prns.h public domain C/C++ 1 seekable pseudo-random number sequences
aomeba MIT C/C++ 1 constraint solver (Cassowary) w/Lua binding
simrank.hpp MIT C++ 2 SimRank graph similarity algorithm

#multithreading

library license API files description
mm_sched.h zlib C/C++ 1 cross-platform multithreaded task scheduler based on enkiTS

#network

library license API files description
zed_net public domain C/C++ 1 cross-platform socket wrapper
sts_net public domain C/C++ 1 cross-platform socket wrapper (socket sets and packet API)
mm_web.h BSD C/C++ 1 lightweight webserver, fork of webby
par_easycurl.h MIT C/C++ 1 curl wrapper
yocto public domain C/C++ 2 non-production-use http server
EWS BSD C/C++ 1 http server
happyhttp zlib C++ 2 http client requests
mongoose GPLv2 C/C++ 2 http server
LUrlParser MIT C++ 2 lightweight URL & URI parser RFC 1738, RFC 3986
znet MIT C/C++ 1 cross-platform networking w/ lua binding

#json

library license API files description
PicoJSON BSD C++ 1 JSON parse/serializer
json.h public domain C/C++ 2 JSON parser
jzon.h MIT C++ 2 JSON parser
parson MIT C/C++ 2 JSON parser and serializer
json.hpp MIT C++ 1 JSON parse, serialize, deserialize

#parsing

library license API files description
SLRE GPLv2 C/C++ 1 regular expression matcher
mm_lexer.h zlib C/C++ 1 C-esque language lexer
minilibs public domain C 2 two-file regex (also binary tree, etc)
tinymemfile zlib C++ 1 fscanf on in-memory files
inih BSD C/C++ 2 .ini file parser

#profiling

library license API files description
Remotery Apache 2.0 C/C++ 2 CPU/GPU profiler Win/Mac/Linux, using web browser for viewer
MicroProfile public domain C++ 2-4 CPU (and GPU?) profiler, 1-3 header files, uses miniz internally
prof MIT C/C++ 1 profiler for Linux

#scripting

library license API files description
LIL zlib C/C++ 2 interpreter for a Tcl-like scripting language
lualite MIT C++ 1 generate lua bindings in C++
Picol BSD C/C++ 1 interpreter for a Tcl-like scripting language
s7 BSD C/C++ 2 interpreter for a subset of Scheme (R5RS/R7RS)

#strings

library license API files description
DG_misc.h public domain C/C++ 1 Daniel Gibson's stb.h-esque cross-platform helpers: path/file, strings
utf8 public domain C/C++ 1 utf8 string library
strpool.h public domain C/C++ 1 string interning
dfa MIT C/C++ 2 fast utf8 decoder (need a header file)
gb_string.h public domain C/C++ 1 dynamic strings

#tests

library license API files description
utest MIT C/C++ 1 unit testing
catch Boost C++ 1 unit testing
doctest MIT C++ 1 unit testing
SPUT BSD C/C++ 1 unit testing
minctest zlib C 1 unit testing
greatest iSC C 1 unit testing
µnit MIT C 1 unit testing
labrat public domain C/C++ 1 unit testing
hippomocks LGPL C++ 1 unit testing
fctx BSD C/C++ 1 unit testing

#user interface

library license API files description
dear imgui MIT C++ 9 an immediate-mode GUI formerly named "ImGui"; 3rd-party C wrapper
nuklear public domain C/C++ 1 minimal GUI toolkit
noc_file_dialog.h MIT C/C++ 1 file open/save dialogs (Linux/OSX/Windows)
tinyfiledialogs ZLIB C/C++ 2 modal dialogs inc. file open/save (Linux/OSX/Windows)
linenoise BSD C/C++ 2 terminal readline w/ history etc

#vectors

library license API files description
mm_vec.h BSD C/C++ 1 SIMD vector math
Handmade Math public domain C/C++ 1 vector math
gb_math public domain C/C++ 1 Vector, quaternion and matrix math w/o math.h
ccVector.h public domain C/C++ 1 Vector, quaternion and matrix math
linalg.h public domain C++ 1 vector/matrix/quaternion math
linalg ISC C/C++ 1 vector/matrix/quaternion math
algebra3.h public domain C++ 1 vector utilities for 2, 3, and 4 element vectors, all inline

#video

library license API files description
jo_mpeg public domain C++ 1 mpeg file writer

#miscellaneous

library license API files description
MakeID.h public domain C++ 1 allocate/deallocate small integer IDs efficiently
tinyformat Boost C++ 1 typesafe printf
visit_struct Boost C++ 2 struct-field reflection
stmr MIT C 2 extract English word stems
levenshtein MIT C 2 compute edit distance between two strings
tinytime zlib C/C++ 1 quick-and-dirty time elapsed time

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

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. This is the preferred link.

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.