Building CivetWeb

This guide covers the build instructions for the stand-alone web server. See for information on extending an existing C or C++ application. A brief overview of the source code files can be found in as well.

Where to get the source code?

The latest version can be found at

Released versions can be found at

Building for Windows

Using Visual Studio

Open the VS/civetweb.sln in Visual Studio. To include SSL support, you may have to add an extra library for the cryptography support. You might wish to use yaSSL. However, it is GPL licensed or uses a commercial license. See for more information. Alternatively, you might wish to use OpenSSL. See for more information.

Using MinGW-w64 or TDM-GCC

In the start menu locate and run the “Run terminal” batch file. For TDM-GCC this is named “MinGW Command Prompt”. Navigate to the civetweb sources directory and run:

mingw32-make CC=gcc

Using Qt Creator

Open the Qt Designer project in the Qt folder

Using CMake

Except for the components in the third_party folder (e.g., Lua and Duktape), CivetWeb can also be built with CMake. CMake can be used for all supported operating systems.

Building for Linux, BSD, and OSX

Using Make

make help

Get a list of all supported make option

make build

compile the code

make install

Install on the system, Linux only.

make lib WITH_CPP=1 WITH_IPV6=1
make clean slib WITH_CPP=1 WITH_LUA=1 WITH_WEBSOCKET=1

Build the static and shared libraries. The WITH_CPP make option is to include the CivetServer class. The additional make options configure the library just as it would the application.

The slib option should be done on a separate clean build as position independent code (PIC) is required for it. Trying to run it after building the static library or the server will result in a link error.

make clean

Clean up files generated during the build

Setting build options

Make options can be set on the command line with the make command like so.

make build WITH_LUA=1
Make OptionsDescription
WITH_LUA=1build with Lua support
WITH_DUKTAPE=1build with server-side JavaScript support
WITH_DEBUG=1build with GDB debug support
WITH_IPV6=1with IPV6 support
WITH_WEBSOCKET=1build with web socket support
WITH_SERVER_STATS=1build with support for server statistics
WITH_CPP=1build libraries with c++ classes
CONFIG_FILE=fileuse ‘file’ as the config file
CONFIG_FILE2=fileuse ‘file’ as the backup config file
HTMLDIR=/pathplace to install initial web pages
DOCUMENT_ROOT=/pathHTMLDIR override, config option, install
nothing is installed here.
PORTS=8080listening ports override when installing versioned SSL library versioned CRYPTO library
PREFIX=/usr/localsets the install directory
COPT=‘-DNO_SSL’method to insert compile flags

Note that the WITH_* options used for make are not identical to the preprocessor defines in the source code - usually USE_* is used there.

Changing PREFIX

To change the target destination pass the PREFIX option to the command make install (not make build). Example usage:

$ make build
$ make -n install PREFIX=/opt/civetweb

Note: The -n corresponds to the --dry-run option (it does not make any changes): You can see where make install would install. Example output of the above command:

$ make -n install PREFIX=/opt/civetweb
install -d -m 755  "/opt/civetweb/share/doc/civetweb"
install -m 644 resources/itworks.html /opt/civetweb/share/doc/civetweb/index.html
install -m 644 resources/civetweb_64x64.png /opt/civetweb/share/doc/civetweb/
install -d -m 755  "/opt/civetweb/etc"
install -m 644 resources/civetweb.conf  "/opt/civetweb/etc/"
sed -i 's#^document_root.*$#document_root /opt/civetweb/share/doc/civetweb#' "/opt/civetweb/etc/civetweb.conf"
sed -i 's#^listening_ports.*$#listening_ports 8080#' "/opt/civetweb/etc/civetweb.conf"
install -d -m 755  "/opt/civetweb/share/doc/civetweb"
install -m 644 *.md "/opt/civetweb/share/doc/civetweb"
install -d -m 755 "/opt/civetweb/bin"
install -m 755 civetweb "/opt/civetweb/bin/"

If the output looks good: Just remove the -n option to actually install the software on your system.

Setting compile flags

Compile flags can be set using the COPT make option like so.

make build COPT="-DNDEBUG -DNO_CGI"
Compile FlagsDescription
NDEBUGstrip off all debug code
DEBUGbuild debug version (very noisy)
NO_CGIdisable CGI support
NO_CACHINGdisable caching functionality
NO_SSLdisable SSL functionality
NO_SSL_DLlink against system libssl library
NO_FILESdo not serve files from a directory
SQLITE_DISABLE_LFSdisables large files (Lua only)
SSL_ALREADY_INITIALIZEDdo not initialize libcrypto

Cross Compiling

Take total control with CC, COPT and TARGET_OS as make options. TARGET_OS is used to determine some compile details as will as code function. TARGET_OS values should be be one found in resources/

make CC=arm-none-linux-gnueabi-gcc COPT="-march=armv7-a  -mfpu=vfp -mfloat-abi=softfp" TARGET_OS=FROG

Cocoa DMG Packaging (OSX Only)

Use the alternate Makefile.osx to do the build. The entire build has to be done using Makefile.osx because additional compile and link options are required. This Makefile has all the same options as the other one plus one additional package rule.

make -f Makefile.osx package

Building with Buildroot

Buildroot is a tool for creating cross compiled file systems. Including Civetweb in buildroot is fairly easy. There is even support for various build options.

  1. First, check if it already there.
  • In buildroot, make menuconfig
    • Package Selection for the target --->
    • Networking applications --->
    • civetweb
  1. If not there, just add it
  • copy and from Civetweb‘s contrib/buildroot/ to Buildroot’s package/civetweb/ directory.
  • In Buildroot's *package/, insert the following line in were you will know how to find it in the menu.

    source "package/civetweb/"

Building on Android

This is a small guide to help you run civetweb on Android, originally tested on the HTC Wildfire. Note: You do not need root access to run civetweb on Android.

  • Download the source from the Downloads page.
  • Download the Android NDK from
  • Run /path-to-ndk/ndk-build -C /path-to-civetweb/resources That should generate civetweb/lib/armeabi/civetweb
  • Using the adb tool (you need to have Android SDK installed for that), push the generated civetweb binary to /data/local folder on device.
  • From adb shell, navigate to /data/local and execute ./civetweb.
  • To test if the server is running fine, visit your web-browser and navigate to You should see the Index of / page.


  • jni stands for Java Native Interface. Read up on Android NDK if you want to know how to interact with the native C functions of civetweb in Android Java applications.