rocksdb :: Comparatorを拡張している現在のクラスにいくつかのリンクの問題があります。RocksDBのコンパレータの実装
< rocksdb:
"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のクラスと同等以下であります/comparator.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; }
};
リンクファー実行可能ファイルへのSEは、.oファイルに関する次のエラーが発生します
NumericKeyComparator.cpp.o:(.data.rel.ro+0x10): undefined rederence to "typeinfo for rocksdb::Comparator"
collect2: error: ld returned 1 exit status
を私はクラスを拡張する方法について問題があると思います(私以来、私は、知らない話すsincerlyにもかかわらず
/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_db_test.cc
に設けられた例を追従しようとしまし」結合は自動的CMakeのによって提供されますしたがって、リンクの問題であってはなりません。私は.cppファイルをコンパイルしている間に-frttiフラグを設定しようとしても、クラス宣言を.hそのものに移すことさえしようとしましたが、何も起こりませんでした。私はここでStackOverflowですべての答えを読んできましたが、解決策は見つかりませんでした。