我尝试为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代码,其中定义了leveldb :: DB :: Open,结果证明它是一个静态方法。
class DB {
public:
static Status Open(const Options& options,
const std::string& name,
DB** dbptr);
/* much more stuff */
}
这可能会在链接时以某种方式产生问题吗?
答案 0 :(得分: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
-llibrary
链接时搜索名为library的库。它在您编写此选项的命令中有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,
foo.o -lz bar.o' searches library
z&#39;在文件foo.o之后但在bar.o之前如果bar.o引用了`z&#39;中的函数,则可能无法加载这些函数。