سؤال

أحاول أن أكتب فئة المجمع ل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 */
}

هل يمكن أن يؤدي هذا إلى حدوث مشكلات بطريقة أو بأخرى عند الارتباط؟

هل كانت مفيدة؟

المحلول

أعتقد أن هذا هو ترتيب ارتباط المكتبة.حاول وضع -leveldb بعد CLevelDBStore.o:

g ++ -wall test.cpp -o0 -ggdb -l/path/to/leveldb -i/path/to/leveldb/include -oall -o2.

من خيارات دول مجلس التعاون الخليجي للربط:

-مكتبة

ابحث في المكتبة المسماة مكتبة عند الارتباط.يحدث فرقًا حيث تكتب هذا الخيار في الأمر؛يقوم الرابط بالبحث عن المكتبات وملفات الكائنات ومعالجتها بالترتيب المحدد لها.هكذا، foo.o -lz bar.o' searches libraryz' بعد الملف foo.o ولكن قبل bar.o.إذا كان bar.o يشير إلى وظائف في `z'، فقد لا يتم تحميل هذه الوظائف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top