The lib directory is split into several sub-directories, in order to make it easier to select or exclude features.
Makefile
script is provided, supporting Makefile conventions, including commands variables, staged install, directory variables and standard targets.
make
: generates both static and dynamic librariesmake install
: install libraries and headers in target system directorieslibzstd
default scope is pretty large, including compression, decompression, dictionary builder, and support for decoding legacy formats >= v0.5.0. The scope can be reduced on demand (see paragraph modular build).
Multithreading is disabled by default when building with make
. Enabling multithreading requires 2 conditions :
ZSTD_MULTITHREAD
(-DZSTD_MULTITHREAD
for gcc
)-pthread
compilation flag for gcc
)Both conditions are automatically applied when invoking make lib-mt
target.
When linking a POSIX program with a multithreaded version of libzstd
, note that it's necessary to request the -pthread
flag during link stage.
Multithreading capabilities are exposed via the advanced API defined in lib/zstd.h
. This API is still labelled experimental, but is expected to become "stable" in the near future.
Zstandard's stable API is exposed within lib/zstd.h.
Optional advanced features are exposed via :
lib/common/zstd_errors.h
: translates size_t
function results into a ZSTD_ErrorCode
, for accurate error handling.
ZSTD_STATIC_LINKING_ONLY
: if this macro is defined before including zstd.h
, it unlocks access to the experimental API, exposed in the second part of zstd.h
. All definitions in the experimental APIs are unstable, they may still change in the future, or even be removed. As a consequence, experimental definitions shall never be used with dynamic library ! Only static linking is allowed.
It's possible to compile only a limited set of features within libzstd
. The file structure is designed to make this selection manually achievable for any build system :
Directory lib/common
is always required, for all variants.
Compression source code lies in lib/compress
Decompression source code lies in lib/decompress
It's possible to include only compress
or only decompress
, they don't depend on each other.
lib/dictBuilder
: makes it possible to generate dictionaries from a set of samples. The API is exposed in lib/dictBuilder/zdict.h
. This module depends on both lib/common
and lib/compress
.
lib/legacy
: makes it possible to decompress legacy zstd formats, starting from v0.1.0
. This module depends on lib/common
and lib/decompress
. To enable this feature, define ZSTD_LEGACY_SUPPORT
during compilation. Specifying a number limits versions supported to that version onward. For example, ZSTD_LEGACY_SUPPORT=2
means : "support legacy formats >= v0.2.0". Conversely, ZSTD_LEGACY_SUPPORT=0
means "do not support legacy formats". By default, this build macro is set as ZSTD_LEGACY_SUPPORT=5
. Decoding supported legacy format is a transparent capability triggered within decompression functions. It's also allowed to invoke legacy API directly, exposed in lib/legacy/zstd_legacy.h
. Each version does also provide its own set of advanced API. For example, advanced API for version v0.4
is exposed in lib/legacy/zstd_v04.h
.
While invoking make libzstd
, it's possible to define build macros ZSTD_LIB_COMPRESSION, ZSTD_LIB_DECOMPRESSION
, ZSTD_LIB_DICTBUILDER
, and ZSTD_LIB_DEPRECATED
as 0
to forgo compilation of the corresponding features. This will also disable compilation of all dependencies (eg. ZSTD_LIB_COMPRESSION=0
will also disable dictBuilder).
There are some additional build macros that can be used to minify the decoder.
Zstandard often has more than one implementation of a piece of functionality, where each implementation optimizes for different scenarios. For example, the Huffman decoder has complementary implementations that decode the stream one symbol at a time or two symbols at a time. Zstd normally includes both (and dispatches between them at runtime), but by defining HUF_FORCE_DECOMPRESS_X1
or HUF_FORCE_DECOMPRESS_X2
, you can force the use of one or the other, avoiding compilation of the other. Similarly, ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
and ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG
force the compilation and use of only one or the other of two decompression implementations. The smallest binary is achieved by using HUF_FORCE_DECOMPRESS_X1
and ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
.
For squeezing the last ounce of size out, you can also define ZSTD_NO_INLINE
, which disables inlining, and ZSTD_STRIP_ERROR_STRINGS
, which removes the error messages that are otherwise returned by ZSTD_getErrorName
.
DLL can be created using MinGW+MSYS with the make libzstd
command. This command creates dll\libzstd.dll
and the import library dll\libzstd.lib
. The import library is only required with Visual C++. The header file zstd.h
and the dynamic library dll\libzstd.dll
are required to compile a project using gcc/MinGW. The dynamic library has to be added to linking options. It means that if a project that uses ZSTD consists of a single test-dll.c
file it should be linked with dll\libzstd.dll
. For example:
gcc $(CFLAGS) -Iinclude/ test-dll.c -o test-dll dll\libzstd.dll
The compiled executable will require ZSTD DLL which is available at dll\libzstd.dll
.
Obsolete API on their way out are stored in directory lib/deprecated
. At this stage, it contains older streaming prototypes, in lib/deprecated/zbuff.h
. These prototypes will be removed in some future version. Consider migrating code towards supported streaming API exposed in zstd.h
.
The other files are not source code. There are :
BUCK
: support for buck
build system (https://buckbuild.com/)Makefile
: make
script to build and install zstd library (static and dynamic)README.md
: this filedll/
: resources directory for Windows compilationlibzstd.pc.in
: script for pkg-config
(used in make install
)