Development
編譯時遇到問題
在通過許多錯誤編譯alt-coin windows qt之後。
一切都可以正常編譯,直到系統將 exe 組合在一起的最後階段。
您可以在下面找到錯誤。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
檢查您
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
否決了您的 MSYSfile.exe
。它們的工作方式非常不同,並且不可互換。LevelDB 的 makefile 使用 Unix 風格find.exe
。您可以通過將 MSYSfind.exe
目錄顯式放在 Windowsfind.exe
目錄之前來解決此問題(應該類似於C:\Window\System32\find.exe
)。這是一個很難追踪的問題,你可以在 bitcointalk.org 上的“官方”建構比特幣執行緒上看到我的進展(以及 Ron,他對我幫助很大,謝謝 Ron!) 。從第 28 頁開始,一直往下直到你再也看不到我的名字(我在那裡也叫 Jori,這是我的真名)。
這意味著 leveldb 沒有正確編譯,在我使用的 cygwin 上
make -f makefile.unix clean TARGET_OS="Linux"; make -f makefile.unix
使用 mingw
TARGET_OS
可能Linux
或NATIVE_WINDOWS
也嘗試更改權限leveldb/build_detect_platform
以使其可執行