Habe ein Problem beim Kompilieren

Nachdem ich mich durch viele Fehler beim Kompilieren eines Altcoin-Fensters qt gearbeitet habe.

Alles kompiliert gut bis zur letzten Phase, wenn das System die exe zusammenstellt.

Sie finden den Fehler unten. leveldb ist installiert und die Dateien libleveldb.a und libmemenv.a befinden sich korrekt in src/leveldb ... Jede Hilfe zur Lösung dieses Problems wäre willkommen.

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
Verbindest du dich mit LevelDB?
@DavidSchwartz Ich glaube, das Bitcoin-Makefile wird automatisch die leveldb-Bibliothek verknüpfen. Ich hatte einmal ein ähnliches Problem, dessen Lösung viel Zeit gekostet hat. Ich werde es als Antwort posten.

Antworten (2)

Prüfen Sie, ob Sie libleveldb.aalle notwendigen Dateien korrekt kompiliert haben. Könnten Sie bitte die folgenden Befehle ausführen und die Ausgabe zurücksenden?

ar tv libmemenv.aund ar tv libleveldb.a. Wenn die Ausgabe etwas ähnliches ist

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

dann könnte das Problem sein, dass Ihr Windows find.exeIhr MSYS außer Kraft setzt file.exe. Beide funktionieren sehr unterschiedlich und sind nicht austauschbar. Das Makefile von LevelDB verwendet den Unix-Stil find.exe. find.exeSie können dies beheben, indem Sie Ihr MSYS- Verzeichnis explizit vor das Windows- find.exeVerzeichnis setzen (das so etwas wie sein sollte C:\Window\System32\find.exe).

Dies war ein sehr schwer aufzuspürendes Problem, und Sie können meinen Fortschritt (und den von Ron, der mir freundlicherweise sehr geholfen hat, danke Ron!) im „ offiziellen“ Thread zum Erstellen von Bitcoin auf bitcointalk.org sehen . Ab Seite 28 und weiter nach unten, bis Sie meinen Namen nicht mehr sehen (dort heiße ich auch Jori, das ist mein richtiger Name).

das heißt leveldb nicht richtig kompiliert, auf cygwin verwende ich

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

mit mingw TARGET_OSvielleicht Linuxoder NATIVE_WINDOWSauch versuchen, die Berechtigung zu ändern leveldb/build_detect_platform, um es als ausführbar zu machen