1. 程式人生 > >比特幣0.9.2中文版編譯手冊

比特幣0.9.2中文版編譯手冊

比特幣0.9.2中文版編譯手冊

日期:2014-07-01

構建比特幣原始碼,是一件十分費時費力的工作,尤其在windows系統中編譯比特幣原始碼更加的麻煩,經過一兩天努力,終於在windows7 64位系統中成功編譯出了比特幣原始檔。現在總結如下,首先準備一套乾淨的windows7 64位作業系統,最好是使用vbox或者vmware虛擬機器建立一個專用系統,這樣的可以防止其它干擾導至編譯失敗,接下來說說,我的編譯過程:

1.安裝msys系統

msys作用是在windows系統中重建linux系統編譯環境,在msys系統下操作,就像linux中的操作一樣,具有相同的語法命令。從下面的網址中下載msys

最新版:

然後執行mingw-get-setup.exe檔案後,選擇安裝目錄為H\MinGW,之後軟體會首先更新下載庫,更新成功會彈出一個視窗MinGW installation manager,在這個視窗中,只下載msys相關的包檔案,不要下載mingw相關檔案,因為不使用它帶的這個mingw

主要如下面所示:

msys-base-bin

msys-autoconf-bin

msys-automake-bin

msys-libtool-bin

選擇好之後,點選Installation->Apply changes即可。一定要確保mingw包沒有被下載,這裡我們只需要msys

相關係統,也要確保msys-gccmsys-w32api等包沒有被下載,否則當我們執行編譯時,可能會呼叫這些不該出現的包檔案,而導至編譯失敗。

2.安裝perl系統

由於在編譯比特幣時,需要呼叫一些perl指令碼,所以從下面的網址中下載一個perl安裝程式,然後安裝即可。

3.安裝python

同樣還需要用到python環境,這裡下載最新版的pytnon3.4.0版,並安裝它。在安裝時,注意選擇add python to path.

4.安裝MinGW

下載安裝最新版的mingw 4.9.0版本,i686-4.9.0-release-posix-dwarf-rt_v3-rev2.7z

通過下面的網址可以下載:

將這個mingw包中檔案全部解壓到H盤的mingw32目錄內,你可根據自己的需要解壓到合適位置。安裝後應該如下圖所示:

5.設定環境變數

在桌面上,滑鼠右鍵計算機圖示,在彈出選單中選擇屬性,在彈出視窗中,在左側邊欄中,選擇高階系統設定,接著選擇高階選項卡中的環境變數按鈕,在彈出視窗中,將系統變數中的path,新增H:\mingw32\bin,而perlpython安裝後,會自動進行設定變數,如果沒有,也應新增進來,如下面所示:

H:\MinGW32\bin;C:\Python34\;C:\Python34\Scripts;D:\Perl64\site\bin;D:\Perl64\bin;

6.檢測編譯環境是否正確

首先檢查H:\MinGW\bin目錄中,確保目錄中只有一個mingw-get.exe檔案。然後執行控制檯cmd,在命令列中輸入gcc -v,將會看到如下面所示,則環境正確:

7.下載並編譯相關檔案包

本文中,將用到所有相關檔案包,都下載到了H:\deps目錄中了,所以在接下來的編譯過程中,將圍繞這個目錄。

啟動msysh:\MinGW\msys\1.0\msys.bat),然後使用下面的命令解壓並編譯OpenSSL檔案。

cd /h/deps/

tar xvfz openssl-1.0.1h.tar.gz

cd openssl-1.0.1h

Configure no-shared no-dso mingw

make

可以上將面的檔案包存為openssl.sh檔案,然後msys中直接執行這個檔案即可。在這裡要注意的是,也不知道什麼原因,有時候使用這種指令碼方式執行時,會發現命令處理到一半時,就提前退出了,我在我電腦中發現,經常不會執行最後make命令,如果你發現指令碼沒有make時,可以直接繼續輸入make即可。

編譯完成後,將會如下圖所法介面所示:

在這裡,最好是下載db-4.8.30.NC.tar.gz版本,其它版本不一定能用,依然是從msys中進行編譯DB資料庫,命令如下所示:

cd /h/deps/

tar xvfz db-4.8.30.NC.tar.gz

cd db-4.8.30.NC/build_unix

../dist/configure --enable-mingw --enable-cxx --disable-shared --disable-replication

make

這裡使用最新版的boost 1.55.0,下載之後,將檔案解壓到H:\deps\boost_1_55_0內。然後啟動windows命令控制檯cmd,然後使用下面的命令進行編譯,請注意下面的b2命令是一行命令(不要在msys中執行下面的命令,否則不能成功,boost編譯時間較長):

cd h:\deps\boost_1_55_0\

bootstrap.bat mingw

b2 --build-type=complete --with-chrono --with-filesystem --with-program_options --with-system --with-thread toolset=gcc variant=release link=static threading=multi runtime-link=static stage

b2命令中設定,會將boost的編譯結果複製到h:\deps\boost_1_55_0\stage內。

先在msys系統中,使用tar命令解壓miniupnpc-1.9.tar.gz,命令如下:

cd /h/deps/

tar xvfz miniupnpc-1.9.tar.gz

將解壓出來的miniupnpc-1.9資料夾,重新命名為minupnpc,接著在windows命令控制檯cmd中,編譯miniupnpc,命令如下所示:

cd h:\deps\miniupnpc

mingw32-make -f Makefile.mingw init upnpc-static

然後使用winrar或者7zip將它解壓,然後接著在msys中執行下面的命令,編譯它們:

cd /h/deps/protobuf-2.5.0

configure --disable-shared

make

依然是在msys中編譯ligpng,命令如下所示:

cd /c/deps/libpng-1.6.12
configure --disable-shared
make

cp .libs/libpng16.a .libs/libpng.a

在編譯qrencode時會用到libpng庫,所以編譯命令如下所示:

tar xvfz qrencode-3.4.3.tar.gz

cd /h/deps/qrencode-3.4.3

LIBS="../libpng-1.6.12/.libs/libpng.a ../../mingw32/i686-w64-mingw32/lib/libz.a" \
png_CFLAGS="-I../libpng-1.6.12" \
png_LIBS="-L../libpng-1.6.12/.libs" \
configure --enable-static --disable-shared --without-tools

make

7.8 Qt 5.3.0編譯

這裡要注意的是,由於比特幣原始碼要求必須使用SSLZlib支援,所以只能下載QT原始碼,重新編譯QT下載地址如下所示:

QT基礎包解壓到h:\Qt\5.3.1目錄中,將QT工具包解壓到h:\Qt\qttools-opensource-src-5.3.1。然後在windows控制檯CMD中執行下面命令:

set INCLUDE=c:\deps\libpng-1.6.10;h:\deps\openssl-1.0.1g\include

set LIB=c:\deps\libpng-1.6.10\.libs;h:\deps\openssl-1.0.1g

cd c:\Qt\5.2.1

configure.bat -release -opensource -confirm-license -static -make libs -no-sql-sqlite -no-opengl -system-zlib -qt-pcre -no-icu -no-gif -system-libpng -no-libjpeg -no-freetype -no-angle -no-vcproj -openssl-linked -no-dbus -no-audio-backend -no-wmf-backend -no-qml-debug

mingw32-make

set PATH=%PATH%;c:\Qt\5.2.1\bin

cd c:\Qt\qttools-opensource-src-5.2.1

qmake qttools.pro

mingw32-make

在這裡,我將上面的命令儲存為了一個批處理檔案,但是當我執行這個批處理時,發現並沒有時執行最後的mingw32-make任務,只是進行了configure操作後就停止了,所以如果在你電腦上也是這種情況的話,可以分別進入H:\Qt\5.2.1H:\Qt\qttools-opensource-src-5.2.1目錄內,重新執行mingw32-make命令各一次。

8.編譯比特幣原始碼:

將原始碼包解壓到H:\bitcoin-0.9.2目錄內,然後在msys中執行下面的命令表:

cp /h/deps/libpng-1.6.10/.libs/libpng16.a /h/deps/libpng-1.6.10/.libs/libpng.a

cd /h/bitcoin-0.9.1

./autogen.sh

CPPFLAGS="-I/h/deps/boost_1_55_0 \

-I/h/deps/db-4.8.30.NC/build_unix \

-I/h/deps/openssl-1.0.1g/include \

-I/h/deps \

-I/h/deps/protobuf-2.5.0/src \

-I/h/deps/libpng-1.6.10 \

-I/h/deps/qrencode-3.4.3" \

LDFLAGS="-L/h/deps/boost_1_55_0/stage/lib \

-L/h/deps/db-4.8.30.NC/build_unix \

-L/h/deps/openssl-1.0.1g \

-L/h/deps/miniupnpc \

-L/h/deps/protobuf-2.5.0/src/.libs \

-L/h/deps/libpng-1.6.10/.libs \

-L/h/deps/qrencode-3.4.3/.libs" \

./configure \

--disable-upnp-default \

--disable-tests \

--with-qt-incdir=/h/Qt/5.2.1/include \

--with-qt-libdir=/h/Qt/5.2.1/lib \

--with-qt-bindir=/h/Qt/5.2.1/bin \

--with-qt-plugindir=/h/Qt/5.2.1/plugins \

--with-boost-system=mgw48-mt-s-1_55 \

--with-boost-filesystem=mgw48-mt-s-1_55 \

--with-boost-program-options=mgw48-mt-s-1_55 \

--with-boost-thread=mgw48-mt-s-1_55 \

--with-boost-chrono=mgw48-mt-s-1_55 \

--with-protoc-bindir=/h/deps/protobuf-2.5.0/src

make

strip src/bitcoin-cli.exe

strip src/bitcoind.exe

strip src/qt/bitcoin-qt.exe

在編譯比特幣原始碼時,中途會提示是否刪除一些中件檔案,可以使用下面的補丁指令碼,可以讓編譯器自動跳過這些提問:

--- Makefile.include Sun Mar 16 12:05:28 2014

+++ Makefile.include Wed Mar 26 03:05:58 2014

@@ -40,18 +40,18 @@

 ui_%.h: %.ui

  @test -d $(abs_builddir)/$(@D) || $(MKDIR_P) $(abs_builddir)/$(@D)

  @test -f $(UIC) && QT_SELECT=$(QT_SELECT) $(UIC) -o $(abs_builddir)/[email protected] $(abs_srcdir)/$< || echo error: could not build $(abs_builddir)/[email protected]

- $(SED) -i.bak -e '/^\*\*.*Created:/d' $(abs_builddir)/[email protected] && rm $(abs_builddir)/[email protected]

- $(SED) -i.bak -e '/^\*\*.*by:/d' $(abs_builddir)/[email protected] && rm $(abs_builddir)/[email protected]

+ $(SED) -i.bak -e '/^\*\*.*Created:/d' $(abs_builddir)/[email protected] && rm -f $(abs_builddir)/[email protected]

+ $(SED) -i.bak -e '/^\*\*.*by:/d' $(abs_builddir)/[email protected] && rm -f $(abs_builddir)/[email protected]

 %.moc: %.cpp

  QT_SELECT=$(QT_SELECT) $(MOC) $(QT_INCLUDES) $(MOC_DEFS) -o [email protected] $<

- $(SED) -i.bak -e '/^\*\*.*Created:/d' [email protected] && rm [email protected]

- $(SED) -i.bak -e '/^\*\*.*by:/d' [email protected] && rm [email protected]

+ $(SED) -i.bak -e '/^\*\*.*Created:/d' [email protected] && rm -f [email protected]

+ $(SED) -i.bak -e '/^\*\*.*by:/d' [email protected] && rm -f [email protected]

 moc_%.cpp: %.h

  QT_SELECT=$(QT_SELECT) $(MOC) $(QT_INCLUDES) $(MOC_DEFS) -o [email protected] $<

- $(SED) -i.bak -e '/^\*\*.*Created:/d' [email protected] && rm [email protected]

- $(SED) -i.bak -e '/^\*\*.*by:/d' [email protected] && rm [email protected]

+ $(SED) -i.bak -e '/^\*\*.*Created:/d' [email protected] && rm -f [email protected]

+ $(SED) -i.bak -e '/^\*\*.*by:/d' [email protected] && rm -f [email protected]

 %.qm: %.ts

  @test -d $(abs_builddir)/$(@D) || $(MKDIR_P) $(abs_builddir)/$(@D)

--- qt/Makefile.am Sun Mar 16 12:05:28 2014

+++ qt/Makefile.am Wed Mar 26 03:06:21 2014

@@ -371,7 +371,7 @@

 $(QT_QRC_CPP): $(QT_QRC) $(QT_QM) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) $(PROTOBUF_H)

  @cd $(abs_srcdir); test -f $(RCC) && QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin -o $(abs_builddir)/[email protected] $< || \

    echo error: could not build [email protected]

- $(SED) -i.bak -e '/^\*\*.*Created:/d' [email protected] && rm [email protected]

- $(SED) -i.bak -e '/^\*\*.*by:/d' [email protected] && rm [email protected]

+ $(SED) -i.bak -e '/^\*\*.*Created:/d' [email protected] && rm -f [email protected]

+ $(SED) -i.bak -e '/^\*\*.*by:/d' [email protected] && rm -f [email protected]

 CLEANFILES = $(BUILT_SOURCES) $(QT_QM) $(QT_FORMS_H) *.gcda *.gcno