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)
posted @ 2025-05-03 15:56  Theophania  阅读(57)  评论(0)    收藏  举报