【问题标题】:Implementing a Comparator for RocksDB为 RocksDB 实现一个比较器
【发布时间】:2017-08-10 02:50:45
【问题描述】:

当前扩展 Rocksdb::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中的类:

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): 未定义重新引用到“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 上阅读所有答案,但没有找到解决方案。

【问题讨论】:

    标签: c++ c++11 leveldb rocksdb


    【解决方案1】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2011-01-29
      • 2022-08-18
      • 2016-06-04
      • 2018-07-06
      相关资源
      最近更新 更多