风一样的回忆

新浪微薄腾讯微薄

最新碎语:最近开始学习俄语!!!

您的位置:风一样的回忆 >钱包wallet> [原创] shunk算法加密货币编译详解实例~

[原创] shunk算法加密货币编译详解实例~

最近给自己发行的watcoin升级成skunk算法,由于各种原因导致编译失败,从Ubuntu->window->Ubuntu来回折腾了无数次,使用自动编译脚本最终没能生成Ubuntu下交叉编译的window客户端。想来想去最后还是觉得在windows下使用MinGW32一步步编译。

编译需要的依赖包:【依赖包】

                default path               download
OpenSSL         \openssl-1.0.2l        http://www.openssl.org/source/
Berkeley DB     \db-4.8.30.NC         http://www.oracle.com/technology/software/products/berkeley-db/index.html
Boost           \boost-1.64.0          http://www.boost.org/users/download/
miniupnpc       \miniupnpc-1.9         http://miniupnp.tuxfamily.org/files/

========================准备环境==================================

一、访问http://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download

下载安装程序之后,通过安装管理程序,按安装以下内容:

From MinGW installation manager -> All packages -> MSYS

选中以下安装包

msys-base-bin

msys-autoconf-bin

msys-automake-bin

msys-libtool-bin

点 apply changes开始安装。他会自动下载安装好。

需要注意的是,确保不要安装msys-gcc和msys-w32api ,因为这两个包和我们的编译系统发生冲突。

很多人出现一些莫名其妙的问题,就是因为这两个包。

二、安装 MinGW-builds

 访问

http://sourceforge.net/projects/mingw-w64/files/Toolchains targetting Win32/Personal Builds/mingw-builds/4.8.2/threads-posix/dwarf/i686-4.8.2-release-posix-dwarf-rt_v3-rev3.7z/download


https://jaist.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/7.1.0/threads-posix/dwarf/i686-7.1.0-release-posix-dwarf-rt_v5-rev0.7z

目录结构 :

Mingw32目录-----D:\Qt\Qt5.9.1\Tools\mingw710_32

msys目录  -------D:\Qt\MINGW

扩展包目录 -------D:\Qt\deps


下载并解压缩 i686-4.8.2-release-posix-dwarf-rt_v3-rev3.7z 到d盘根目录  d:\qt\  你可以把第一步安装的msys复制到MinGW32的目录。

注意我的目录结构。你尽量和我一样。

三、设置PATH环境变量,将C:\MinGW\bin;添加到第一个。

四、在命令行模式下输入 gcc -v 会得到以下内容

gcc version 4.8.2 (i686-posix-dwarf-rev3, Built by MinGW-W64 project)

至此,你的开发环境已经搭建好了,很简单吧

=========================开始编译=================================

一、编译 openssl 

MSYS 1.0 Shell:

tar zxvf opebssl-1.0.2l.tar.gz
cd /d/qt/deps/openssl-1.0.2l
./config enable-mingw enable-cxx
make

中间出错几次提示ERROR_之类的错误,修改:在报错文件头部加#include "winerror.h".

文件:

    /d/qt/deps/openssl-1.0.1b-mgw/crypt/cryptlib.c

    /d/qt/deps/openssl-1.0.1b-mgw/crypt/bio/bss_file.c

注意:最好安装完整的MinGW,不要看网上其他教程只安装部分,如果安装完整,这里的openssl不会报错,编译10多分钟就结束了。

二、编译 db-4.8.30.NC

MSYS 1.0 Shell:

tar zxvf db-4.8.30.NC.tar.gz
cd /d/qt/deps/db-4.8.30.NC/build_unix
sh ../dist/configure --enable-mingw --enable-cxx  --disable-shared --disable-replication
make

三、编译Boost ,最好选择1.47.0以上版本

MSYS 1.0 Shell

cd /d/qt/deps/
tar zxvf boost_1_50_0.tar.gz

DOS:

cd d:/qt/deps/boost_1_50_0
d:
bootstrap.bat mingw
b2.exe --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.exe,请安装VC6.0++


注意:在dos命令窗口执行

四、编译 MiniUPnPc

MSYS 1.0 Shell:

UPnP support is optional, make with USE_UPNP= to disable it.

tar zxvf miniupnpc-1.9.tar.gz
cd /d/qt/deps/miniupnpc-1.9
make -f Makefile.mingw
mkdir miniupnpc
cp *.h miniupnpc/

建议使用最新的1.9版本以上,已经修复以下几个1.6版本的问题:

1) 修改Makefile.mingw

    这个是patch文件, 添加del 命令定义,添加-Wl,前缀。

    需要修改-enable-stdcall-fixup为-Wl,-enable-stdcall-fixup:

    否则-enable-stdcall-fixup的-e会被理解成windows上可执行文件的入口指令,这应该是编译器的一个bug。

大概第61行 ,64行要修改

==================================================================

五、编译zlib 和libpng1.6.10

参考:https://blog.csdn.net/forfuture3513/article/details/52916464

1.  编译zlib

下载 http://www.zlib.net/ 下载版本zlib-1.2.8, 解压缩文件zlib-1.2.8。进入mingw命令行,切换目录到zlib-1.2.8解压缩目录。

命令行输入 mingw32-make -f makefile.gcc

  编译生成 libz.a, libz.dll.a, zlib1.dll等文件

  

2. 编译libpng

   下载源码,解压缩。切换到源码路径。

    打开scripts/makefile.gcc设置zlib路径:

    ZLIBINC = ../zlib-1.2.8

    ZLIBLIB = ../zlib-1.2.8

    拷贝scripts/pnglibconf.h.prebuilt到源码目录,改名为pnglibconf.h
    命令行输入:

    copy scripts\makefile.gcc makefile.gcc
    mingw32-make -f makefile.gcc

    生成libpng.a文件

注意:libpng16.a文件在linux  ubuntu下生成.【这一步也可以在mingw32下生成】,请看下面

用任意编辑器打开pnglibconf.h文件,修改成下图样子。
然后继续执行命令
./configure --with-zlib-prefix=../zlib-1.2.8
make
1.png

六、编译qrencode3.4.3

cd /c/deps/qrencode-3.4.3

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

make

下面开始Mingw编译 makefile.mingw 获得 Watcoind.exe

cd /d/watcoin/src
make -f makefile.mingw [需要配置相关依赖路径]
编译完得到watcoind.exe

---------------------------------------------编译Qt钱包-----------------------------------------------

使用命令生成leveldb: msys shell:

make libleveldb.a libmemenv.a

倒入项目到Qt Creator 将以下内容复制到pro文件的“”UI_DIR“”下面

MINIUPNPC_INCLUDE_PATH=d:/Qt/deps/miniupnpc-1.9
MINIUPNPC_LIB_PATH=d:/Qt/deps/miniupnpc-1.9
BOOST_LIB_SUFFIX=-mgw48-mt-s-1_64
BOOST_INCLUDE_PATH=d:/Qt/deps/boost_1_64_0
BOOST_LIB_PATH=d:/Qt/deps/boost_1_64_0/stage/lib
BDB_INCLUDE_PATH=D:/Qt/deps/db-4.8.30.NC/build_unix
BDB_LIB_PATH=d:/Qt/deps/db-4.8.30.NC/build_unix
OPENSSL_INCLUDE_PATH=D:/Qt/deps/openssl-1.0.2l/include
OPENSSL_LIB_PATH=d:/Qt/deps/openssl-1.0.2l
BDB_LIB_SUFFIX=-4.8
QRENCODE_INCLUDE_PATH=d:/Qt/deps/qrencode-3.4.4
QRENCODE_LIB_PATH=d:/Qt/deps/qrencode-3.4.4/.libs
点击运行开始编译,等到编译结束。

==========================MinGW编译watcoind===========================

# Copyright (c) 2009-2010 Satoshi Nakamoto
# Distributed under the MIT/X11 software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.

USE_UPNP:=0
USE_WALLET:=1

INCLUDEPATHS= \
 -I"d:\qt\deps\boost_1_50_0" \
 -I"d:\qt\deps\db-4.8.30.NC\build_unix" \
 -I"d:\qt\deps\openssl-1.0.1c\include"

LIBPATHS= \
 -L"d:\qt\deps\boost_1_50_0\stage\lib" \
 -L"d:\qt\deps\db-4.8.30.NC\build_unix" \
 -L"d:\qt\deps\openssl-1.0.1c"

LIBS= \
 -l boost_system-mgw48-mt-s-1_50 \
 -l boost_filesystem-mgw48-mt-s-1_50 \
 -l boost_program_options-mgw48-mt-s-1_50 \
 -l boost_thread-mgw48-mt-s-1_50 \
 -l boost_chrono-mgw48-mt-s-1_50 \
 -l db_cxx \
 -l ssl \
 -l crypto

DEFS=-DWIN32 -D_WINDOWS -DBOOST_THREAD_USE_LIB -DBOOST_SPIRIT_THREADSAFE
DEBUGFLAGS=-g
CFLAGS=-mthreads -O2 -msse2 -w -Wall -Wextra -Wno-ignored-qualifiers -Wformat -Wformat-security -Wno-unused-parameter $(DEBUGFLAGS) $(DEFS) $(INCLUDEPATHS)
LDFLAGS=-Wl,--dynamicbase -Wl,--nxcompat

TESTDEFS = -DTEST_DATA_DIR=$(abspath test/data)

ifndef USE_UPNP
    override USE_UPNP = -
endif
ifneq (${USE_UPNP}, -)
 INCLUDEPATHS += -I"d:\qt\deps\miniupnpc-1.6"
 LIBPATHS += -L"d:\qt\deps\miniupnpc-1.6"
 LIBS += -l miniupnpc -l iphlpapi
 DEFS += -DMINIUPNP_STATICLIB -DSTATICLIB -DUSE_UPNP=$(USE_UPNP)
endif

LIBS += -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 mswsock -l shlwapi

# TODO: make the mingw builds smarter about dependencies, like the linux/osx builds are
HEADERS = $(wildcard *.h)

OBJS= \
    obj/alert.o \
    obj/version.o \
    obj/checkpoints.o \
    obj/netbase.o \
    obj/addrman.o \
    obj/crypter.o \
    obj/key.o \
    obj/init.o \
    obj/bitcoind.o \
    obj/keystore.o \
    obj/core.o \
    obj/main.o \
    obj/net.o \
    obj/protocol.o \
    obj/rpcclient.o \
    obj/rpcprotocol.o \
    obj/rpcserver.o \
    obj/rpcmisc.o \
    obj/rpcnet.o \
    obj/rpcblockchain.o \
    obj/rpcrawtransaction.o \
    obj/timedata.o \
    obj/script.o \
    obj/sync.o \
    obj/txmempool.o \
    obj/util.o \
    obj/hash.o \
    obj/noui.o \
    obj/kernel.o \
    obj/pbkdf2.o \
    obj/scrypt.o \
    obj/scrypt-x86.o \
    obj/scrypt-x86_64.o \
    obj/chainparams.o

ifeq (${USE_WALLET}, 1)
    DEFS += -DENABLE_WALLET
    OBJS += \
        obj/db.o \
        obj/miner.o \
        obj/rpcdump.o \
        obj/rpcmining.o \
        obj/rpcwallet.o \
        obj/wallet.o \
        obj/walletdb.o
endif

all: watcoind.exe

LIBS += $(CURDIR)/leveldb/libleveldb.a $(CURDIR)/leveldb/libmemenv.a
DEFS += $(addprefix -I,$(CURDIR)/leveldb/include)
DEFS += $(addprefix -I,$(CURDIR)/leveldb/helpers)
OBJS += obj/txdb-leveldb.o
leveldb/libleveldb.a:
    cd leveldb; make; cd ..
obj/txdb-leveldb.o: leveldb/libleveldb.a

obj/%.o: %.cpp $(HEADERS)
    g++ -c $(CFLAGS) -o $@ $<

obj/scrypt-x86.o: scrypt-x86.S
    $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<

obj/scrypt-x86_64.o: scrypt-x86_64.S
    $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<

watcoind.exe: $(OBJS:obj/%=obj/%)
    g++ $(CFLAGS) $(LDFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS)
clean:
    -del /Q watcoind
    -del /Q obj\*

FORCE:

==================================后记=================================

折腾来、折腾去、终于成功的编译出无错版的WatCoin-qt.exe 新版客户端。

系统环境:Window7 64位旗舰版 SP1

编译环境:Qt5.9.1 + Qt Creator + MinGW6.4【静态编译Qt库】

钱包下载:http://www.whobt.com/wallet/241.html

1522507247649953.png

---

转载请注明本文标题和链接:《[原创] shunk算法加密货币编译详解实例~

分享到:

发表评论

路人甲 表情
看不清楚?点图切换 Ctrl+Enter快速提交

网友评论(2)

大佬怎么修改算法,比如把比特币的 sha256 换成 XXXXX算法 ?需要修改哪些函数和文件?
moonswamp 2年前 (2018-03-26) 回复
@moonswamp:很多地方 ,主要在main.cpp init.cpp chainparams.cpp
霏凡 2年前 (2018-03-27) 回复