2

leveldb のラッパー クラスを作成しようとしています。基本的に、私の問題を生成するヘッダー ファイルの部分は ( CLevelDBStore.h:)

#include "leveldb/db.h"
#include "leveldb/comparator.h"

using namespace leveldb;
class CLevelDBStore {

    public:
        CLevelDBStore(const char* dbFileName);
        virtual              ~CLevelDBStore();

        /* more stuff */ 67 private:

    private:
        CLevelDBStore();
        static               leveldb::DB* ldb_;
};

CLevelDBStore.cppファイル内の対応するコードは次のとおりです。

#include "CLevelDBStore.h"
DB* CLevelDBStore::ldb_;

CLevelDBStore::CLevelDBStore(const char* dbFileName) {
    Options options;
    options.create_if_missing = true;

    DB::Open((const Options&)options, (const std::string&) dbFileName, (DB**)&ldb_);
    Status status = DB::Open(options, dbFileName);
}

ここで、テスト ファイル ( ) をコンパイルしようとしましたtest.cppが、これは基本的には

#include "leveldb/db.h"
#include "leveldb/comparator.h"
#include "CLevelDBStore.h"

int main() {
    std::cout << "does not compile" << std::endl;
    return 0;
}

ラッパー クラスもまだ使用していないことに注意してください。コンパイルエラーを生成するだけです。

コンパイル

g++ -Wall -O0 -ggdb -c CLevelDBStore.cpp -I/path/to/leveldb/include
g++ -Wall test.cpp -O0 -ggdb -L/path/to/leveldb -I/path/to/leveldb/include \
   -lleveldb -Wall -O2   -lz -lpthread ./CLevelDBStore.o -llog4cxx \
   -o levelDBStoretest

収量

CLevelDBStore.cpp:27: undefined reference to `leveldb::DB::Open(leveldb::Options const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, leveldb::DB**)'

leveldb::DB::Open が定義されている leveldb コードを調べたところ、静的メソッドであることが判明しました。

class DB {
    public:
        static Status Open(const Options& options,
                           const std::string& name,
                           DB** dbptr);
    /* much more stuff */
}

これにより、リンク時に何らかの問題が発生する可能性はありますか?

4

1 に答える 1

3

これはライブラリリンク順だと思います。-leveldb後に配置してみてくださいCLevelDBStore.o

g ++ -Wall test.cpp -O0 -ggdb -L ​​/ path / to / leveldb -I / path / to / leveldb / include -Wall -O2 ./CLevelDBStore.o -lleveldb -lz -lpthread -llog4cxx -o levelDBStoretest

リンク用のGCCオプションから:

-llibrary

リンク時にlibraryという名前のライブラリを検索します。コマンドのどこにこのオプションを書くかによって違いが生じます。リンカは、指定された順序でライブラリとオブジェクトファイルを検索して処理します。したがって、foo.o -lz bar.o' searches libraryファイルfoo.oの後、bar.oの前のz'。bar.oが`z'の関数を参照している場合、それらの関数はロードされない可能性があります。

于 2012-01-23T17:06:10.823 に答える