Возникла проблема с компиляцией

После того, как я проделал множество ошибок при компиляции альтернативной монеты windows qt.

Все прекрасно компилируется вплоть до финальной стадии, когда система собирает исполняемый файл.

Вы можете найти ошибку ниже. leveldb установлен, а файлы libleveldb.a и libmemenv.a правильно находятся в src/leveldb... Будем признательны за любую помощь в решении этой проблемы.

uuid -lgdi32 -lboost_system-mgw48-mt-1_54 -lboost_filesystem-mgw48-mt-1_54 -lboo
st_program_options-mgw48-mt-1_54 -lboost_thread-mgw48-mt-1_54 -lboost_chrono-mgw
48-mt-1_54 -lQtGui4 -lQtCore4
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x433): undefined reference to `l
eveldb::DB::Open(leveldb::Options const&, std::string const&, leveldb::DB**)'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x73f): undefined reference to `l
eveldb::Status::ToString() const'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x866): undefined reference to `l
eveldb::WriteBatch::~WriteBatch()'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x89f): undefined reference to `l
eveldb::WriteBatch::WriteBatch()'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x921): undefined reference to `l
eveldb::WriteBatch::~WriteBatch()'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x944): undefined reference to `l
eveldb::Status::ToString() const'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0xac4): undefined reference to `l
eveldb::WriteBatch::Iterate(leveldb::WriteBatch::Handler*) const'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0xaf5): undefined reference to `l
eveldb::WriteBatch::Handler::~Handler()'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0xb24): undefined reference to `l
eveldb::Status::ToString() const'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x14a9): undefined reference to `
leveldb::Status::ToString() const'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x176f): undefined reference to `
leveldb::WriteBatch::Put(leveldb::Slice const&, leveldb::Slice const&)'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x18b2): undefined reference to `
leveldb::Status::ToString() const'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x1a57): undefined reference to `
leveldb::Options::Options()'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x1ae0): undefined reference to `
leveldb::Options::Options()'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x1b35): undefined reference to `
leveldb::NewLRUCache(unsigned int)'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x1b44): undefined reference to `
leveldb::NewBloomFilterPolicy(int)'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x1b9c): undefined reference to `
leveldb::NewBloomFilterPolicy(int)'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x2021): undefined reference to `
leveldb::WriteBatch::~WriteBatch()'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x211d): undefined reference to `
leveldb::Status::ToString() const'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x35c3): undefined reference to `
leveldb::WriteBatch::Delete(leveldb::Slice const&)'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x6488): undefined reference to `
leveldb::WriteBatch::~WriteBatch()'
./build\txdb-leveldb.o:txdb-leveldb.cpp:(.text+0x64b8): undefined reference to `
leveldb::WriteBatch::~WriteBatch()'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: ./build\tx
db-leveldb.o: bad reloc address 0x2 in section `.text$_ZN5boost16exception_detai
l10clone_baseD1Ev[__ZN5boost16exception_detail10clone_baseD1Ev]'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link
 failed: Invalid operation
collect2.exe: error: ld returned 1 exit status
Вы ссылаетесь на LevelDB?
@DavidSchwartz Я считаю, что make-файл биткойнов автоматически свяжет библиотеку leveldb. У меня когда-то была похожая проблема, решение которой стоило много времени. Я опубликую это как ответ.

Ответы (2)

Проверьте, правильно ли вы libleveldb.aскомпилировали все необходимые файлы. Не могли бы вы выполнить следующие команды и опубликовать вывод обратно?

ar tv libmemenv.aи ar tv libleveldb.a. Если вывод похож на

rw-rw-rw- 0/0 432255 Apr 15 16:56 2014 memenv.o
rw-rw-rw- 0/0  21322 Apr 15 16:56 2014 port_win.o

тогда проблема может заключаться в том, что ваша Windows find.exeотменяет ваш MSYS file.exe. Они оба работают по-разному и не взаимозаменяемы. Makefile LevelDB использует стиль Unix find.exe. Вы можете исправить это, явно поместив свой find.exeкаталог MSYS перед каталогом Windows find.exe(который должен быть примерно таким C:\Window\System32\find.exe).

Эту проблему было очень трудно отследить, и вы можете увидеть мой прогресс (и прогресс Рона, который любезно помог мне, спасибо, Рон!) в «официальной» ветке создания Биткойн на bitcointalk.org . Начиная со страницы 28 и продолжая вниз, пока вы больше не увидите мое имя (там меня тоже зовут Джори, это мое настоящее имя).

это означает, что leveldb не скомпилирован должным образом, на cygwin я использую

make -f makefile.unix clean
TARGET_OS="Linux"; make -f makefile.unix

с mingw, TARGET_OSвозможно Linux, или NATIVE_WINDOWSтакже попробуйте изменить разрешение leveldb/build_detect_platform, чтобы сделать его исполняемым