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?

Était-ce utile?

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

De Options GCC pour lier:

-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 libraryz '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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top