Реализация компаратора для RocksDB

У меня есть некоторые проблемы с связью с текущим классом, расширяющим rockdb :: Comparator

«NumericKeyComparator.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:

< rocksdb / comptor.h>

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): неопределенное указание на «typeinfo для rocksdb :: Comparator»

collect2: error: ld вернул 1 состояние выхода

Хотя я думаю, что есть проблема с тем, как я расширил класс (но, честно говоря, я не знаю, так как я пытался следовать примеру, приведенному в comparator_db_test.ccCMake автоматически обеспечивает связывание, так как при использовании подробного флага выясняется, что оно следующее:

/ usr / bin / c ++ -fopenmp -lpthread -lrt -lsnappy -lz -lbz2 -llz4 -lzstd -lnuma -g CMakeFiles / .dir // main.cpp.o … CMakeFiles / .dir // lib / serializer / rocksdb / comptors / 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/libd. -lrocksdb -lpthread -lm -lsnappy -llz4 -lz -lbz2 -lzstd

Класс Comparator является виртуальным и предоставляется в заголовке, поэтому он не должен быть проблемой связывания. Я даже пытаюсь установить флаги -frtti при компиляции файла .cpp и даже переместить объявление класса в сам .h, но ничего не произошло. Я читал все ответы здесь, на StackOverflow, но я не нашел решения.

0

Решение

увидеть https://github.com/facebook/rocksdb/pull/3008
Кажется, это ошибка.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]