Building on Windows
This is a simple explanation of how to build RocksDB by either:
- Method 1 - Windows 10, and Visual Studio 2019.
- Method 2 - Windows 11, and Visual Studio 2022.
- Method 3 - vcpkg, Windows 10, and Visual Studio 2017/2019.
Method 1 - Windows 10, and Visual Studio 2019.
This is a simple step-by-step explanation of how I was able to build RocksDB (or RocksJava) and all of the 3rd-party libraries on Microsoft Windows 10. The Windows build system was already in place, however it took some trial-and-error for me to be able to build the 3rd-party libraries and incorporate them into the build.
Pre-requisites
- Microsoft Visual Studio 2019 (Community) with “Desktop development with C++” installed
- CMake - I used version 3.20 installed from the 64bit MSI installer
- Git - I used the Windows Git Bash.
- wget
- Java 8 - I used BellSoft Liberica JDK 8 https://bell-sw.com/pages/downloads/
Steps
Create a directory somewhere on your machine that will be used as a container for both the RocksDB source code and that of its 3rd-party dependencies. On my machine I used C:\Users\aretter\code, from hereon in I will just refer to it as %CODE_HOME%; which can be set as an environment variable, i.e. SET CODE_HOME=C:\Users\aretter\code.
All of the following is executed from the “Developer Command Prompt for VS2019“:
Build GFlags
cd %CODE_HOME%wget https://github.com/gflags/gflags/archive/refs/tags/v2.2.2.zipunzip v2.2.2.zipcd gflags-2.2.2mkdir targetcd targetcmake -G "Visual Studio 16 2019" -A x64 ..msbuild gflags.sln /p:Configuration=Debug /p:Platform=x64msbuild gflags.sln /p:Configuration=Release /p:Platform=x64
The resultant static library can be found in %CODE_HOME%\gflags-2.2.2\target\lib\Debug\gflags_static.lib or %CODE_HOME%\gflags-2.2.2\target\lib\Release\gflags_static.lib.
Build Snappy
cd %CODE_HOME%wget https://github.com/google/snappy/archive/refs/tags/1.1.9.zipunzip 1.1.9.zipcd snappy-1.1.9mkdir buildcd buildcmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_GENERATOR_PLATFORM=x64 -DSNAPPY_BUILD_TESTS=OFF -DSNAPPY_BUILD_BENCHMARKS=OFF ..msbuild Snappy.sln /p:Configuration=Debug /p:Platform=x64msbuild Snappy.sln /p:Configuration=Release /p:Platform=x64
The resultant static library can be found in %CODE_HOME%\snappy-1.1.9\build\Debug\snappy.lib or %CODE_HOME%\snappy-1.1.9\build\Release\snappy.lib.
Build LZ4
Requires Windows 8.1 SDK from - https://go.microsoft.com/fwlink/p/?LinkId=323507
cd %CODE_HOME%wget https://github.com/lz4/lz4/archive/refs/tags/v1.9.4.zipunzip v1.9.4.zipcd lz4-1.9.4cd visual\VS2017devenv lz4.sln /upgrademsbuild lz4.sln /p:Configuration=Debug /p:Platform=x64msbuild lz4.sln /p:Configuration=Release /p:Platform=x64
The resultant static library can be found in %CODE_HOME%\lz4-1.9.4\visual\VS2017\bin\x64_Debug\liblz4_static.lib or %CODE_HOME%\lz4-1.9.4\visual\VS2017\bin\x64_Release\liblz4_static.lib.
Build ZLib
cd %CODE_HOME%wget https://zlib.net/fossils/zlib-1.3.1.tar.gztar zxvf zlib-1.3.1.tar.gzcd zlib-1.3.1\contrib\vstudio\vc14devenv zlibvc.sln /upgrademsbuild zlibvc.sln /p:Configuration=Debug /p:Platform=x64msbuild zlibvc.sln /p:Configuration=Release /p:Platform=x64copy x64\ZlibDllDebug\zlibwapi.lib x64\ZlibStatDebug\copy x64\ZlibDllRelease\zlibwapi.lib x64\ZlibStatRelease\
The resultant static library can be found in %CODE_HOME%\zlib-1.3.1\contrib\vstudio\vc14\x64\ZlibStatDebug\zlibstat.lib or %CODE_HOME%\zlib-1.3.1\contrib\vstudio\vc14\x64\ZlibStatRelease\zlibstat.lib.
Build ZStd
wget https://github.com/facebook/zstd/archive/v1.5.5.zipunzip v1.5.5.zipcd zstd-1.5.5\build\VS2010devenv zstd.sln /upgrademsbuild zstd.sln /p:Configuration=Debug /p:Platform=x64msbuild zstd.sln /p:Configuration=Release /p:Platform=x64
The resultant static library can be found in %CODE_HOME%\zstd-1.5.5\build\VS2010\bin\x64_Debug\libzstd_static.lib or %CODE_HOME%\zstd-1.5.5\build\VS2010\bin\x64_Release\libzstd_static.lib.
Build RocksDB
cd %CODE_HOME%git clone https://github.com/facebook/rocksdb.gitcd rocksdb
Edit the file %CODE_HOME%\rocksdb\thirdparty.inc to have these changes:
set(GFLAGS_HOME $ENV{THIRDPARTY_HOME}/gflags-2.2.2)set(GFLAGS_INCLUDE ${GFLAGS_HOME}/target/include)set(GFLAGS_LIB_DEBUG ${GFLAGS_HOME}/target/lib/Debug/gflags_static.lib)set(GFLAGS_LIB_RELEASE ${GFLAGS_HOME}/target/lib/Release/gflags_static.lib)set(SNAPPY_HOME $ENV{THIRDPARTY_HOME}/snappy-1.1.9)set(SNAPPY_INCLUDE ${SNAPPY_HOME} ${SNAPPY_HOME}/build)set(SNAPPY_LIB_DEBUG ${SNAPPY_HOME}/build/Debug/snappy.lib)set(SNAPPY_LIB_RELEASE ${SNAPPY_HOME}/build/Release/snappy.lib)set(LZ4_HOME $ENV{THIRDPARTY_HOME}/lz4-1.9.4)set(LZ4_INCLUDE ${LZ4_HOME}/lib)set(LZ4_LIB_DEBUG ${LZ4_HOME}/visual/VS2017/bin/x64_Debug/liblz4_static.lib)set(LZ4_LIB_RELEASE ${LZ4_HOME}/visual/VS2017/bin/x64_Release/liblz4_static.lib)set(ZLIB_HOME $ENV{THIRDPARTY_HOME}/zlib-1.3.1)set(ZLIB_INCLUDE ${ZLIB_HOME})set(ZLIB_LIB_DEBUG ${ZLIB_HOME}/contrib/vstudio/vc14/x64/ZlibStatDebug/zlibstat.lib)set(ZLIB_LIB_RELEASE ${ZLIB_HOME}/contrib/vstudio/vc14/x64/ZlibStatRelease/zlibstat.lib)set(ZSTD_HOME $ENV{THIRDPARTY_HOME}/zstd-1.5.5)set(ZSTD_INCLUDE ${ZSTD_HOME}/lib ${ZSTD_HOME}/lib/dictBuilder)set(ZSTD_LIB_DEBUG ${ZSTD_HOME}/build/VS2010/bin/x64_Debug/libzstd_static.lib)set(ZSTD_LIB_RELEASE ${ZSTD_HOME}/build/VS2010/bin/x64_Release/libzstd_static.lib)
And then finally to compile RocksDB:
NOTE: The default CMake build will generate MSBuild project files which include the
/arch:AVX2flag. If you have this CPU extension instruction set, then the generated binaries will also only work on other CPU’s with AVX2. If you want to create a build which has no specific CPU extensions, then you should also pass the-DPORTABLE=1flag in thecmakearguments below.NOTE: The build options below include
-DXPRESS=1which enables Microsoft XPRESS compression. This requires Windows 10 or newer to work reliably and is not backwards compatible with older versions of Windows. At present we build RocksJava releases without XPRESS.
mkdir buildcd buildset JAVA_HOME="C:\Program Files\BellSoft\LibericaJDK-8-Full"set THIRDPARTY_HOME=C:/Users/aretter/codecmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=20 -DJNI=1 -DGFLAGS=1 -DSNAPPY=1 -DLZ4=1 -DZLIB=1 -DZSTD=1 -DXPRESS=1 ..msbuild rocksdb.sln /p:Configuration=Release
Method 2 - Windows 11, and Visual Studio 2022
This is a simple step-by-step explanation of how I was able to build RocksDB (or RocksJava) and all of the 3rd-party libraries on Microsoft Windows 11. The Windows build system was already in place, however it took some trial-and-error for me to be able to build the 3rd-party libraries and incorporate them into the build.
Pre-requisites
- Microsoft Visual Studio 2022 (Community) with “Desktop development with C++” installed
- CMake - I used version 3.27.3 installed from the 64bit MSI installer
- Java 8 - I used BellSoft Liberica JDK 8 https://bell-sw.com/pages/downloads/
- Power Shell
Steps
Create a directory somewhere on your machine that will be used as a container for both the RocksDB source code and that of its 3rd-party dependencies. On my machine I used C:\Users\aretter\code, from hereon in I will just refer to it as CODE_HOME; which can be set as an environment variable (in Powershell), i.e. $Env:CODE_HOME = "C:\Users\aretter\code".
All of the following is executed from the “Developer PowerShell for VS2022“:
Build GFlags
cd $Env:CODE_HOMEwget https://github.com/gflags/gflags/archive/refs/tags/v2.2.2.zip -OutFile gflags.zipExpand-Archive gflags.zip -DestinationPath .cd gflags-2.2.2mkdir targetcd targetcmake -G "Visual Studio 17 2022" -A x64 ..msbuild gflags.sln /p:Configuration=Debug /p:Platform=x64msbuild gflags.sln /p:Configuration=Release /p:Platform=x64
The resultant static library can be found in $Env:CODE_HOME\gflags-2.2.2\target\lib\Debug\gflags_static_debug.lib or $Env:CODE_HOME\gflags-2.2.2\target\lib\Release\gflags_static.lib.
Build Snappy
cd $Env:CODE_HOMEwget https://github.com/google/snappy/archive/refs/tags/1.1.9.zip -OutFile snappy.zipExpand-Archive snappy.zip -DestinationPath .cd snappy-1.1.9mkdir targetcd targetcmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_GENERATOR_PLATFORM=x64 -DSNAPPY_BUILD_TESTS=OFF -DSNAPPY_BUILD_BENCHMARKS=OFF ..msbuild Snappy.sln /p:Configuration=Debug /p:Platform=x64msbuild Snappy.sln /p:Configuration=Release /p:Platform=x64
The resultant static library can be found in $Env:CODE_HOME\snappy-1.1.9\build\Debug\snappy.lib or $Env:CODE_HOME\snappy-1.1.9\build\Release\snappy.lib.
Build LZ4
cd $Env:CODE_HOMEwget https://github.com/lz4/lz4/archive/refs/tags/v1.9.4.zip -OutFile lz4.zipExpand-Archive lz4.zip -DestinationPath .cd lz4-1.9.4mkdir targetcd targetcmake -G "Visual Studio 17 2022" -A x64 -S ../build/cmakemsbuild LZ4.sln /p:Configuration=Debug /p:Platform=x64msbuild LZ4.sln /p:Configuration=Release /p:Platform=x64
The resultant static library can be found in $Env:CODE_HOME\lz4-1.9.4\target\Debug or $Env:CODE_HOME\lz4-1.9.4\target\Release.
Build ZLib
cd $Env:CODE_HOMEwget https://github.com/madler/zlib/releases/download/v1.3.1/zlib131.zip -OutFile zlib.zipExpand-Archive zlib.zip -DestinationPath .cd zlib-1.3.1mkdir targetcd targetcmake -G "Visual Studio 17 2022" -A x64 -S ..msbuild zlib.sln /p:Configuration=Debug /p:Platform=x64msbuild zlib.sln /p:Configuration=Release /p:Platform=x64
The resultant static library can be found in $Env:CODE_HOME\zlib-1.3.1\target\Debug\zlibstaticd.lib or $Env:CODE_HOME\zlib-1.3.1\target\Release\zlibstatic.lib.
Build ZStd
cd $Env:CODE_HOMEwget https://github.com/facebook/zstd/archive/refs/tags/v1.5.5.zip -OutFile zstd.zipExpand-Archive zstd.zip -DestinationPath .cd zstd-1.5.5mkdir targetcd targetcmake -G "Visual Studio 17 2022" -A x64 -S ../build/cmakemsbuild zstd.sln /p:Configuration=Debug /p:Platform=x64msbuild zstd.sln /p:Configuration=Release /p:Platform=x64
The resultant static library can be found in $Env:CODE_HOME\zstd-1.5.5\target\lib\Debug\zstd_static.lib or $Env:CODE_HOME\zstd-1.5.5\target\lib\Release\zstd_static.lib.
Build RocksDB
cd $Env:CODE_HOMEwget https://github.com/facebook/rocksdb/archive/refs/heads/main.zip -OutFile rocksdb.zipExpand-Archive rocksdb.zip -DestinationPath .cd rocksdb-main
Edit the file %CODE_HOME%\rocksdb-main\thirdparty.inc to have these changes:
set(GFLAGS_HOME $ENV{THIRDPARTY_HOME}/gflags-2.2.2)set(GFLAGS_INCLUDE ${GFLAGS_HOME}/target/include)set(GFLAGS_LIB_DEBUG ${GFLAGS_HOME}/target/lib/Debug/gflags_static.lib)set(GFLAGS_LIB_RELEASE ${GFLAGS_HOME}/target/lib/Release/gflags_static.lib)set(SNAPPY_HOME $ENV{THIRDPARTY_HOME}/snappy-1.1.9)set(SNAPPY_INCLUDE ${SNAPPY_HOME} ${SNAPPY_HOME}/target)set(SNAPPY_LIB_DEBUG ${SNAPPY_HOME}/target/Debug/snappy.lib)set(SNAPPY_LIB_RELEASE ${SNAPPY_HOME}/target/Release/snappy.lib)set(LZ4_HOME $ENV{THIRDPARTY_HOME}/lz4-1.9.4)set(LZ4_INCLUDE ${LZ4_HOME}/lib)set(LZ4_LIB_DEBUG ${LZ4_HOME}/target/Debug/lz4.lib)set(LZ4_LIB_RELEASE ${LZ4_HOME}/target/Release/lz4.lib)set(ZLIB_HOME $ENV{THIRDPARTY_HOME}/zlib-1.3.1)set(ZLIB_INCLUDE ${ZLIB_HOME} ${ZLIB_HOME}/target )set(ZLIB_LIB_DEBUG ${ZLIB_HOME}/target/Debug/zlibstatic.lib)set(ZLIB_LIB_RELEASE ${ZLIB_HOME}/target/Release/zlibstatic.lib)set(ZSTD_HOME $ENV{THIRDPARTY_HOME}/zstd-1.5.5)set(ZSTD_INCLUDE ${ZSTD_HOME}/lib ${ZSTD_HOME}/lib/dictBuilder)set(ZSTD_LIB_DEBUG ${ZSTD_HOME}/target/lib/Debug/zstd_static.lib)set(ZSTD_LIB_RELEASE ${ZSTD_HOME}/target/lib/Release/zstd_static.lib)
And then finally to compile RocksDB:
NOTE: The default CMake build will generate MSBuild project files which include the
/arch:AVX2flag. If you have this CPU extension instruction set, then the generated binaries will also only work on other CPU’s with AVX2. If you want to create a build which has no specific CPU extensions, then you should also pass the-DPORTABLE=1flag in thecmakearguments below.NOTE: The build options below include
-DXPRESS=1which enables Microsoft XPRESS compression. This requires Windows 10 or newer to work reliably and is not backwards compatible with older versions of Windows. At present we build RocksJava releases without XPRESS.
mkdir buildcd build$Env:JAVA_HOME="C:\Program Files\BellSoft\LibericaJDK-8-Full"$Env:THIRDPARTY_HOME="C:\Users\aretter\code"$env:Path = $env:JAVA_HOME + ";" + $env:Path #CMake find(JNI) have a bug and doesn't support JAVA_HOMEcmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=20 -DJNI=1 -DGFLAGS=1 -DSNAPPY=1 -DLZ4=1 -DZLIB=1 -DZSTD=1 -DXPRESS=1 ..msbuild rocksdb.sln /p:Configuration=Release -maxCpuCount -property:Platform=x64 -target:rocksdb-shared`;rocksdbjni_test_classes`;rocksdbjni`;rocksdbjni_test_classes
Then the resulting libraries can be found in :
- Static library :
build/Release/rocksdb.lib - Dynamic library:
rocksdb-shared.dll - Java jar archive:
build/java/rocksdbjni_classes.jar - Java native library:
build/java/Release/rocksdbjni.dll
Method 3 - vcpkg, Windows 10, and Visual Studio 2017/2019
This is a very simple step-by-step explanation of how I was able to build RocksDB on Microsoft Windows 10. It should be very easy for users who uses vcpkg to install RocksDB. However, vcpkg builds RocksDB as a shared library by default. There are two things we need to do since we have installed vcpkg already.
Step 1
cd %home%\vcpkg\ports\rocksdb, %home% is the path where you installed your vcpkgset(VCPKG_LIBRARY_LINKAGE static)to the top of portfile.cmake and then runningvcpkg install rocksdb:x64-windows. If you have installed rocksdb as a static library, runvcpkg remove rocksdb:x64-windowsbefore install command. The resultant static library can be found in%home%\vcpkg\packages\rocksdb_x64-windows\lib\rocksdb.librather than%home%\vcpkg\packages\rocksdb_x64-windows\lib\rocksdb-shared.lib.
Step 2
- include
Shlwapi.libandRpcrt4.libas the input of your project linker manually.
