Liant la méthode statique en classe d'emballage pour le niveaudb
Question
J'essaie d'écrire une classe d'emballage pour le niveaudb. Fondamentalement, la partie du fichier d'en-tête qui génère mon problème est (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_;
};
Le code correspondant dans le CLevelDBStore.cpp
Le fichier est:
#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);
}
J'essaie maintenant de compiler mon fichier de test (test.cpp
), qui est essentiellement
#include "leveldb/db.h"
#include "leveldb/comparator.h"
#include "CLevelDBStore.h"
int main() {
std::cout << "does not compile" << std::endl;
return 0;
}
Remarque, je n'utilise même pas encore la classe d'emballage. C'est juste pour générer l'erreur de compilation.
La compilation
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
rendements
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**)'
J'ai regardé le code NIDEDB où le niveaudb :: db :: ouvert est défini et il s'est avéré être une méthode statique.
class DB {
public:
static Status Open(const Options& options,
const std::string& name,
DB** dbptr);
/* much more stuff */
}
Cela pourrait-il en quelque sorte générer des problèmes lors du lien?
La solution
Je pense que c'est l'ordre des liens de bibliothèque. Essayez de placer -leveldb
après CLevelDBStore.o
:
g ++ -wall test.cpp -o0 -ggdb -l / path / to / niveaudb -i / path / to / niveaudb / include -wall -o2 ./cleveldbstore.o -Llleveldb -lz -lpthread -llog4cxx -o niveaudbstorestrest
-Library
Recherchez la bibliothèque nommée bibliothèque lors du lien. Cela fait une différence où, dans la commande, vous écrivez cette option; Le linker recherche et traite les bibliothèques et les fichiers d'objets dans l'ordre où ils sont spécifiés. Ainsi,
foo.o -lz bar.o' searches library
z 'après fichier foo.o mais avant Bar.o. Si Bar.o fait référence aux fonctions dans «Z», ces fonctions peuvent ne pas être chargées.