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.
- 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.
See discussion after the list.
There are a lot of JSON parsers listed here. For some analysis and performance results, check out https://github.com/miloyip/nativejson-benchmark
Also you might be interested in other related, but different lists:
- clib: list of (mostly) small single C functions (licenses not listed)
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.)
- 2D graphics
- 3D graphics
- 3D geometry file processing
- AI
- argument processing
- audio
- compression
- cryptography
- data structures
- files and filenames
- hardware interfacing
- image loading, saving, & processing
- mathematics for geometry
- mathematics
- miscellaneous
- multithreading
- networking
- parsing
- profiling
- scripting
- string processing
- tests
- user interface
- video
library | license | API | files | description |
---|---|---|---|---|
micropather | zlib | C++ | 2 | pathfinding with A* |
Genann | zlib | C/C++ | 2 | simple neural networks (ANN) |
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 |
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 |
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 |
library | license | API | files | description |
---|---|---|---|---|
TweetNaCl | public domain | C | 2 | high-quality tiny cryptography library |
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) |
#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 |
#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 |
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 |
---|---|---|---|---|
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 |
ShaderFastLibs | MIT | C++ | 1 | (also HLSL) approximate transcendental functions optimized for shaders (esp. GCN) |
TinyExpr | zlib | C | 2 | evaluation of math expressions from strings |
linalg.h | unlicense | C++ | 1 | vector/matrix/quaternion math |
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 |
#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 |
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 |
#parsing
library | license | API | files | description |
---|---|---|---|---|
SLRE | GPLv2 | C/C++ | 1 | regular expression matcher |
PicoJSON | BSD | C++ | 1 | JSON parse/serializer |
mm_lexer.h | zlib | C/C++ | 1 | C-esque language lexer |
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 |
minilibs | public domain | C | 2 | two-file regex (also binary tree, etc) |
tinymemfile | zlib | C++ | 1 | fscanf on in-memory files |
#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 | unlicense | C++ | 2-4 | CPU (and GPU?) profiler, 1-3 header files, uses miniz internally |
#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 |
pempek_assert.cpp | WTFPLv2 | C++ | 2 | flexible assertions |
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 |
#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) |
#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 |
loguru | public domain | C++ | 1 | flexible logging |
tinyformat | Boost | C++ | 1 | typesafe printf |
visit_struct | Boost | C++ | 2 | struct-field reflection |
debug-assert | zlib | C++ | 1 | modular assertion macro |
dbgtools | zlib | C/C++ | 2 | cross-platform debug util libraries |
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:
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.
Yes. This is the preferred link.
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.
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'.
Come on.