为 RocksDB 实现一个比较器
Implementing a Comparator for RocksDB
我对当前类扩展rocksdb::Comparator有一些链接问题。
"数字键比较器.cpp">
#include <rocksdb/db.h>
#include <rocksdb/comparator.h>
#include "../../structure/structure.h"
#include "../../NumberToString.h"
#include <map>
#include <string>
#include "rocksdb/db.h"
#include "rocksdb/env.h"
namespace rocksdb {
namespace {
class NumericKeyComparator : public Comparator {
public:
~NumericKeyComparator() {}
NumericKeyComparator() {}
// Three-way comparison function:
// if a < b: negative result
// if a > b: positive result
// else: zero result
virtual int Compare(const Slice &a, const Slice &b) const override {
LONG_NUMERIC x, y;
x = StringToNumber<LONG_NUMERIC>(std::string(a.data()));
y = StringToNumber<LONG_NUMERIC>(std::string(b.data()));
if (x == y) return 0;
if (x < y) return -1;
return 1;
};
virtual bool Equal(const Slice &a, const Slice &b) const override {
return StringToNumber<LONG_NUMERIC>(std::string(a.data())) ==
StringToNumber<LONG_NUMERIC>(std::string(b.data()));
}
// Ignore the following methods for now:
virtual const char *Name() const { return "NumericKeyComparator"; };
virtual void FindShortestSeparator(std::string *, const Slice &) const override {};
virtual void FindShortSuccessor(std::string *) const {};
};
}
}
const rocksdb::Comparator* nkcmp() {
static rocksdb::NumericKeyComparator cmp;
return &cmp;
}
特别是,原始类(由 .h 文件提供(如下,相当于 LevelDB 中的类:
class Comparator {
public:
virtual ~Comparator();
virtual int Compare(const Slice& a, const Slice& b) const = 0;
virtual bool Equal(const Slice& a, const Slice& b) const {
return Compare(a, b) == 0;
}
virtual const char* Name() const = 0;
virtual void FindShortestSeparator(
std::string* start,
const Slice& limit) const = 0;
virtual void FindShortSuccessor(std::string* key) const = 0;
virtual const Comparator* GetRootComparator() const { return this; }
};
在链接到可执行文件的阶段,将引发与 .o 文件相关的以下错误:
NumericKeyComparator.cpp.o:(.data.rel.ro+0x10(: undefined rederence to "typeinfo for rocksdb::Comparator">
collect2:错误:ld 返回 1 个退出状态
尽管我认为如何扩展类存在问题(但说实话,我不知道,因为我试图遵循comparator_db_test.cc
中提供的示例,链接由 CMake 自动提供,因为通过使用详细标志,显示如下:
usr/bin/c++ -fopenmp -lpthread -lrt -lsnappy -lz -lbz2 -llz4 -lzstd -lnuma -g CMakeFiles/.dir//main.cpp.o ...CMakeFiles/.dir//lib/serializer/rocksdb/comparators/NumericKeyComparator.cpp.o -o -L/usr/lib/x86_64-linux-gnu/libsnappy.so -L/usr/lib/x86_64-linux-gnu/liblz4.so -L/usr/local/lib/librocksdb.a -Wl,-rpath,/usr/lib/x86_64-linux-gnu/libsnappy.so:/usr/lib/x86_64-linux-gnu/liblz4.so:/usr/local/lib/librocksdb.a ../_tests/lib/googletest/googlemock/gtest/libgtest.a
/usr/local/lib/libstxxl_debug.a -lpthread/usr/lib/x86_64-linux-gnu/libboost_graph.a/usr/lib/x86_64-linux-gnu/libboost_serialization.a/usr/lib/x86_64-linux-gnu/libboost_system.a/usr/lib/x86_64-linux-gnu/libboost_filesystem.a/usr/local/BerkeleyDB.6.2/lib/libdb-6.2.a -lrocksdb -lpthread -lm -lsnappy -llz4 -lz -lbz2 -lzstd
Comparator 类是虚拟的,并在标头中提供,因此它不应该是链接问题。我什至尝试在编译.cpp文件时设置 -frtti 标志,甚至将类声明移动到 .h 本身,但没有任何反应。我一直在阅读StackOverflow上的所有答案,但我没有找到解决方案。
请参阅 https://github.com/facebook/rocksdb/pull/3008 似乎这是一个错误。
- std::设置自定义比较器
- C++中"std::sort"比较器的不同类型
- 全局变量 多读取器 一个写入器多线程安全?
- 将 std::set 与基于键的比较器一起使用
- 带自定义比较器的最小优先级队列
- 函数类作为比较器
- 优先级队列自定义比较器
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- 没有默认构造函数作为模板参数的自定义比较器
- set_intersection使用自定义设置比较器
- 如何为集合 c++ 建立比较器
- C++设置了一个用于排序的比较器和另一个用于唯一性的比较器
- 为 RocksDB 实现一个比较器
- STD :: SET(或STD :: MAP)是否有一个提供基于值的查找的STL比较器?STD :: lands_les
- 使用访问另一个类字段的比较器priority_queue类字段
- 为什么 std::sort 有两个实现(带和不带比较器),而不是一个带有默认模板参数的实现
- 如何创建一个接受比较器的类(对于最大堆和最小堆)
- 为什么我不能将两个不同的比较器传递给一个模板函数?
- 我可以使用boost-bind定义一个比较器来对STL列表进行排序吗
- 如何在qt中创建一个图像比较器?