为RocksDB实现一个比较器

为RocksDB实现一个比较器

问题描述:

我有一些链接问题与当前类扩展rocksdb :: Comparator。为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类:

< rocksdb /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; } 
}; 

在连接阶段本身的可执行文件,涉及到.o文件将以下引发错误:

NumericKeyComparator.cpp.o:(.data.rel.ro+0x10): undefined rederence to "typeinfo for rocksdb::Comparator"

collect2: error: ld returned 1 exit status

即使我觉得这是我如何扩展的类问题(但诚恳地说,我不知道,因为我已经试过跟随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

比较器类是虚拟和报头内提供的,所以它不应该是一个链接问题。我甚至尝试在编译.cpp文件时设置-frtti标志,甚至将类声明移到.h本身,但什么都没有发生。我一直在阅读*的所有答案,但我没有找到解决方案。

看到https://github.com/facebook/rocksdb/pull/3008 看来这是一个错误。