leveldb编译
最近想搞一下leveldb,先试着在win11系统编译一下。
先安装cmake和ninja,ninja解压以后放system32里。
然后构建:
mkdir -p build`
cd build`
cmake ..
这里先有一个问题:提示,thirdparty里面没有googletest和benchmark这两个模块,以及未找到sqlite3和KyotoCabinet库。
用 git submodule update --init --recursive
更新模块,并安装sqlite3。
然后发现有一个cmakelist的最低版本写太低了。
所以改成 cmake .. -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
,注意最后不加引号没法正确解析。
然后 make -j4
并行编译,首先提示没有make,去把bin里的mingw32-make.exe复制一份,重命名为make.exe,不要直接重命名,原来这个在构建的时候有用的。
然后发现工具链污染了,前面的东西是用MSYS的工具构建的,后面就没法用MinGW的make了。
清一下缓存重来。
rm -Force CMakeCache.txt, CMakeFiles -Recurse
cmake -G "MinGW Makefiles" .. -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
然后编译错误了:
In file included from D:\Workspace\leveldb\util\comparator.cc:14:
D:/Workspace/leveldb/util/no_destructor.h: In constructor 'leveldb::NoDestructor<InstanceType>::NoDestructor(ConstructorArgTypes&& ...)':
D:/Workspace/leveldb/util/no_destructor.h:24:24: error: 'is_standard_layout_v' is not a member of 'std'; did you mean 'is_standard_layout'?
24 | static_assert(std::is_standard_layout_v<NoDestructor<InstanceType>>);
| ^~~~~~~~~~~~~~~~~~~~
| is_standard_layout
D:/Workspace/leveldb/util/no_destructor.h:24:70: error: expected primary-expression before '>' token
24 | static_assert(std::is_standard_layout_v<NoDestructor<InstanceType>>);
| ^~
D:/Workspace/leveldb/util/no_destructor.h:24:72: error: expected primary-expression before ')' token
24 | static_assert(std::is_standard_layout_v<NoDestructor<InstanceType>>);
| ^
make[2]: *** [CMakeFiles\leveldb.dir\build.make:499: CMakeFiles/leveldb.dir/util/comparator.cc.obj] Error 1
make[1]: *** [CMakeFiles\Makefile2:215: CMakeFiles/leveldb.dir/all] Error 2
make: *** [Makefile:145: all] Error 2
开一下C++17,cmakelist里面加一下这个
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
然后是
In file included from D:\Workspace\leveldb\third_party\benchmark\src\benchmark_runner.h:22,
from D:\Workspace\leveldb\third_party\benchmark\src\benchmark.cc:18:
D:\Workspace\leveldb\third_party\benchmark\src\internal_macros.h:47: error: "NOMINMAX" redefined
47 | #define NOMINMAX
|
In file included from C:/mingw64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/c++/x86_64-w64-mingw32/bits/c++config.h:679,
from C:/mingw64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/c++/bits/stl_algobase.h:59,
from C:/mingw64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/c++/algorithm:60,
from D:/Workspace/leveldb/third_party/benchmark/include/benchmark/benchmark.h:179,
from D:\Workspace\leveldb\third_party\benchmark\src\benchmark.cc:15:
C:/mingw64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/c++/x86_64-w64-mingw32/bits/os_defines.h:45: note: this is the location of the previous definition
45 | #define NOMINMAX 1
|
make[2]: *** [third_party\benchmark\src\CMakeFiles\benchmark.dir\build.make:79: third_party/benchmark/src/CMakeFiles/benchmark.dir/benchmark.cc.obj] Error 1
make[1]: *** [CMakeFiles\Makefile2:546: third_party/benchmark/src/CMakeFiles/benchmark.dir/all] Error 2
make: *** [Makefile:145: all] Error 2
打开报错文件:leveldb/third_party/benchmark/src/internal_macros.h
定位到第47行的 #define NOMINMAX
,添加条件编译保护:
#ifndef NOMINMAX
#define NOMINMAX
#endif
现在终于编译出来了。
顺便说一下Windows没grep,还有 cmake -G
确认生成器(Generator)类型
$./db_bench --benchmarks="fillseq,readrandom"
LevelDB: version 1.23
Keys: 16 bytes each
Values: 100 bytes each (50 bytes after compression)
Entries: 1000000
RawSize: 110.6 MB (estimated)
FileSize: 62.9 MB (estimated)
WARNING: Optimization is disabled: benchmarks unnecessarily slow
WARNING: Assertions are enabled; benchmarks unnecessarily slow
WARNING: Snappy compression is not enabled
------------------------------------------------
fillseq : 3.034 micros/op; 36.5 MB/s
readrandom : 2.302 micros/op; (1000000 of 1000000 found)