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>を<iostream>に変更してみたが同様)。includesディレクトリからiostream.hを削除すると、単にそのファイルが見つからないと報告されるだけで、上記のような何百行ものエラーは出ない。ファイルは一切変更しておらず、今はただWindows環境でプロジェクトをビルドできるようにしようとしているだけだ……
ここで少し行き詰まっていて、何が問題なのかよく分からない。正直なところ自分のやっていることを完全には理解していない(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バイトアライメントの問題かもしれず、セグフォルトが起きる。いじって、テストプログラムではtcatmのコードを動作させることができたが、何らかの理由で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をビルドしたときに何か失敗した可能性はあるだろうか?) 😊