Windows 7 で Bitcoin のビルドに問題がある
Visual Studio(2010)を使って Bitcoin をソースからビルドしようとしている。win32 の zip アーカイブに含まれているソースを使っている。新しい makefile プロジェクトを作成して makefile をインポートし、boost、wxwidgets、openssl のソースと、ビルド時に不足と報告されたいくつかのファイルを入手した。ビルドログが iostream.h が必要だと報告するところまで進んだので、libstdc++からそのコピーを見つけてきた。しかし、includes ディレクトリに iostream.h を配置してビルドしようとすると、以下のような大量のエラーが出る:
1>------ Build started: Project: bitcoin_test, Configuration: Debug Win32 ------
1>Build started 9/14/2010 08:07:14.
1>InitializeBuildStatus:
1> Touching "Debug\bitcoin_test.unsuccessfulbuild".
1>ClCompile:
1> util.cpp
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(15): error C2143: syntax error : missing ';' before '<'
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(15): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(16): error C2146: syntax error : missing ';' before identifier 'cs_mapAddressBook'
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(16): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(16): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(17): error C2143: syntax error : missing ';' before '<'
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(17): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(23): error C2146: syntax error : missing ';' before identifier 'dbenv'
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(23): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(23): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(34): error C2143: syntax error : missing ';' before '*'
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(34): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(34): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(35): error C2146: syntax error : missing ';' before identifier 'strFile'
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(35): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(35): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(36): error C2143: syntax error : missing ';' before '<'
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(36): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\[myusername]\desktop\bitcoin-0.3.12\src\db.h(36): error C2238: unexpected token(s) preceding ';'
これは 2 つの異なるバージョンの iostream.h で発生した(db.h の<iostream.h>を
ここで行き詰まっており、何が問題なのか分からない。正直なところ自分のやっていることを完全には理解していない(Windows での C++の経験があまりない)が、何が問題なのかアイデアがあれば教えてほしい。
ソースに同梱されている説明に従って、Visual Studio のコマンドプロンプトから nmake コマンドを使ってビルドすべきだ。
ソースに同梱されている説明に従って、Visual Studio のコマンドプロンプトから nmake コマンドを使ってビルドすべきだ。
makefile.mingw があるが、まだ試していないけど、自分の CUDA マイナー用に Windows ビルドに挑戦するつもりだ。これは使えないのだろうか?
引っかかっている行:
ERROR extern map<string, string> mapAddressBook;
ERROR extern CCriticalSection cs_mapAddressBook;
ERROR extern vector<unsigned char> vchDefaultKey;
OK extern bool fClient;
OK extern int nBestHeight;
OK extern unsigned int nWalletDBUpdated;
ERROR extern DbEnv dbenv;
つまり、map や vector さえも、何も定義されていないかのように振る舞っている。
しかし、db.h は headers.h(そこだけで、他の場所からではない)によってインクルードされ、headers.h は db.h の前に vector、map、util.h などすべてをインクルードしている。
VC がプリコンパイル済みヘッダーを使おうとして台無しにしているのか?以前の失敗した試みからディレクトリに残ったプリコンパイル済みヘッダーファイルが見つかって使われている可能性はあるか?
MinGW のインストールを非常に簡単にするインストーラーパッケージが今ある。最新バージョンの 4.5.0 は使わず、4.4.1 (1.908.0)や 1.812.0 のような数バージョン前のものを使ってくれ。セットアッププログラムがすべてを完全にインストールする。以前のように難しくはない。make*.exe を make.exe にリネームするだけでよかったと思う。
http://tdm-gcc.tdragon.net/
話題外だが:tcatm の 4-way 128 ビット SSE2 コードを Windows で動作させるためにハックしてくれる人がいると良いのだが。MinGW の最適化に何か問題があり、確信はないがスタック上の 16 バイトアライメントの問題かもしれず、セグフォルトが起きる。いじって、テストプログラムでは彼のコードを動作させることができたが、何らかの理由で Bitcoin 自体では動作しなかった。
VC は当面諦めて、MinGW でもう少し成功している。将来 VC を試すことに決めたら、また報告する。
http://bitbucket.org/dkaparis/bitcoin-cmake/ にある自分の CMake 版は、MSVC を使って Windows でビルドできる。IDE プロジェクトでもコマンドライン nmake でもどちらも可能だ。CMake さえあれば良い。
(MSVC++はまだ当面諦めている。再フォーマットしたばかりで、Visual Studio とその仲間でシステムを膨れさせたくないので……) これは puddinpop がリリースしたソース bitcoin-CUDA-svn153-src-gpl をビルドしようとしている試みだ。
使用している boost のバージョン(1.44)と mingw 4.5 を反映するため、また絶対パス以外もサポートするため、makefile にいくつかの変更を加えた。現在作業中のものは以下のとおりだ:
# Copyright (c) 2009-2010 Satoshi Nakamoto
# Distributed under the MIT/X11 software license, see the accompanying
# file license.txt or http://www.opensource.org/licenses/mit-license.php.
INCLUDEPATHS=
-I”./boost”
-I”./db/build_unix”
-I”./openssl/include”
-I”./wxwidgets/lib/gcc_lib/mswud”
-I”./wxwidgets/include”
LIBPATHS=
-L”./boost/stage/lib”
-L”./db/build_unix”
-L”./openssl/out”
-L”./wxwidgets/lib/gcc_lib”
WXLIBS=
-l wxmsw29ud_html -l wxmsw29ud_core -l wxmsw29ud_adv -l wxbase29ud -l wxtiffd -l wxjpegd -l wxpngd -l wxzlibd
LIBS=
-l libboost_system-mgw45-mt-d-1_44
-l libboost_filesystem-mgw45-mt-d-1_44
-l libboost_program_options-mgw45-mt-d-1_44
-l libboost_thread-mgw45-mt-d-1_44
-l db_cxx
-l eay32
-l kernel32 -l user32 -l gdi32 -l comdlg32 -l winspool -l winmm -l shell32 -l comctl32 -l ole32 -l oleaut32 -l uuid -l rpcrt4 -l advapi32 -l ws2_32 -l shlwapi
DEFS=-DWIN32 -D__WXMSW__ -D_WINDOWS -DNOPCH
DEBUGFLAGS=-g -D__WXDEBUG__
CFLAGS=-mthreads -O2 -w -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(DEFS) $(INCLUDEPATHS)
HEADERS=headers.h strlcpy.h serialize.h uint256.h util.h key.h bignum.h base58.h
script.h db.h net.h irc.h main.h rpc.h uibase.h ui.h noui.h init.h
OBJS=
obj/util.o
obj/script.o
obj/db.o
obj/net.o
obj/irc.o
obj/main.o
obj/rpc.o
obj/init.o
cryptopp/obj/sha.o
cryptopp/obj/cpu.o
all: bitcoin.exe
obj/%.o: %.cpp $(HEADERS) g++ -c $(CFLAGS) -DGUI -o $@ $<
cryptopp/obj/%.o: cryptopp/%.cpp g++ -c $(CFLAGS) -O3 -DCRYPTOPP_X86_ASM_AVAILABLE -o $@ $<
obj/ui_res.o: ui.rc rc/bitcoin.ico rc/check.ico rc/send16.bmp rc/send16mask.bmp rc/send16masknoshadow.bmp rc/send20.bmp rc/send20mask.bmp rc/addressbook16.bmp rc/addressbook16mask.bmp rc/addressbook20.bmp rc/addressbook20mask.bmp windres $(DEFS) $(INCLUDEPATHS) -o $@ -i $<
bitcoin.exe: $(OBJS) obj/ui.o obj/uibase.o obj/ui_res.o g++ $(CFLAGS) -mwindows -Wl,—subsystem,windows -o $@ $(LIBPATHS) $^ $(WXLIBS) $(LIBS)
obj/nogui/%.o: %.cpp $(HEADERS) g++ -c $(CFLAGS) -o $@ $<
bitcoind.exe: $(OBJS:obj/%=obj/nogui/%) obj/ui_res.o g++ $(CFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS)
clean: -del /Q obj* -del /Q obj\nogui* -del /Q cryptopp\obj* -del /Q headers.h.gch
これまでのところ、cmd.exe から ‘mingw32-make -f makefile.mingw bitcoind.exe’ を呼び出しても、MinGW シェルから ‘make -f makefile.mingw bitcoind.exe’ を呼び出しても、同じ問題が出る。boost_program_options のところまで進んで、以下のエラーで終了する:
C:\Users\[username]\Desktop\bitcoin-CUDA-svn153-src-gpl/./boost/boost/program_options/eof_iterator.hpp:75: undefined reference to `boost::program_options::detail::common_config_file_iterator::get()'
obj/nogui/util.o: In function `basic_config_file_iterator':
C:\Users\[username]\Desktop\bitcoin-CUDA-svn153-src-gpl/./boost/boost/program_options/detail/config_file.hpp:147: undefined reference to `boost::program_options::detail::common_config_file_iterator::common_config_file_iterator(std::set<std::string, std::less<std::string>, std::allocator<std::string> > const&, bool)'
C:\Users\[username]\Desktop\bitcoin-CUDA-svn153-src-gpl/./boost/boost/program_options/detail/config_file.hpp:150: undefined reference to `boost::program_options::detail::common_config_file_iterator::get()'
collect2: ld returned 1 exit status
mingw32-make: *** [bitcoind.exe] Error 1
今ちょっと行き詰まっていて、助けがあれば本当に助かる(boost をビルドしたときに何か失敗した可能性はあるだろうか?) 😊