在win10vs上编译运行bitcoinv01源码下.docx
《在win10vs上编译运行bitcoinv01源码下.docx》由会员分享,可在线阅读,更多相关《在win10vs上编译运行bitcoinv01源码下.docx(6页珍藏版)》请在冰豆网上搜索。
在win10vs上编译运行bitcoinv01源码下
在win10vs2015上编译运行bitcoinv0.1源码(下)
一篇文章详细描述的如何让bitcoinv1.0源码通过编
译,本篇将描述第一次运行过程中修改出现过的问题。
数据库dll加载出错不清楚这个问题是不是个例,bitcoin使用的数据库BerkeleyDBv4.8在oracle官网上下载安装后
1.使用release版本的lib和dll直接使用release版本的dll
在debug下运行bitcoin源码会第184行左右,在
//Clearand
ReadAtCursor函数中的free处崩溃:
freememory
memset(datKey.get_data(),0,datKey.get_size());
memset(datValue.get_data(),0,
datValue.get_size());
free(datKey.get_data());//很可能在这个地方崩溃
free(datValue.get_data());
产生的原因是:
HEAP[bitcoin-v0.1.exe]:
InvalidaddressspecifiedtoRtlValidateHeap(01640000,03177208)
呃••其实我不知道产生的原因是什么,简单的搜索可能的原因是:
在不同模块(工程)之间传递C++类,而这两个模块用了不同的运行时库(RuntimeLibrary)设置。
例如:
EXE模块调用DLL模块里传递C++类的函数,但
Debug是Multi-threadedDebug(/MTd))方式编译,而
EXE模块使用动态链接(Release是Multi-threadedDLL(/MD)、Debug是Multi-threadedDebugDLL(/MDd))方式编译。
HEAP[xxx.exe]:
InvalidAddressspecifiedto
RtlValidateHeap错误的解决方法总结>我也不清楚是不是
这个原因啦,这个问题先搁置下••-•使用2lebug版本的lib
和dll直接使用安装包中自带的那个libdb48d.lib和
libdb48d.dll是在vs2005或者是vs2008平台下构建的。
它在构建这个libdb48.dll和libdb48d.dll的时候分别依赖了
8.0.50727.762版本的libdb48.dll和libdb48d.dll。
这丫是个历史遗留问题,参考:
Side-by-sideassembly这2个dll只会在安装vs2005和vs2008的时候存在,以后都只会以兼容库的形式存在。
但是关键是这个现在绑定版本,所以就造成了crash。
解决方法就是下面的第3点,重新编译。
至于
berkeleydb
release为什么会自动存在,那是因为我在安装的时候安装包把安装的路径\bin填写到了path变量当中,而在这个\bin目录下已经提供了8.0.50727.762版本的
libdb48.dll。
但是它丫却没有在\bin\debug目录下提供
libdb48d.dll。
所以就造成了release能运行,但是因为其他原因崩溃,而debug是直接运行不起来的。
3.解决方法因为安装包中的release和debug都无法运行,所以只能自己编译出BerkeleyDB的lib和dll假设现在的
berkeleydb的根目录是那么在
\\db-4.8.30\build_windows目录下可以找到
Berkeley_DB.sln打开它向上兼容后,进行项目构建,然后将一个example项目设为主项目进行运行。
如果能运行成功就是构建成功并且能够正常运行。
此时在
\\db-4.8.30\build_windows\Win32\Debug\目录下可以发现
libdb48d.lib和libdb48d.dll这两个文件。
而这两个文件就是在自己平台上编译出来的动态链接库。
之后把bitcoin源码的关于BerkeleyDB的依赖库修改为新的路径,然后就可以正常运行了。
。
。
这里修改的路径就是
$(BDBPath)\db-4.8.30\build_windows\Win32\Debug\(参照上一篇)然后把libdb48d.dll拷贝到bitcoin项目的libs目录下。
二、wxWidgets高版本兼容问题ps:
以下的崩溃很可能是因为wxWidgets版本高的原因,要是版本低于3.0/或者
2.8?
(可能)很可能就没这些问题1.运行崩溃崩溃的原因主要是由于在wxWidgets3.0还是2.8收紧了Sizer布局的
Align规则检查的严格性。
当布局的flag出现:
wxEXPAND|wxALIGN_CENTER_XXX
//或者是
//当Sizer设置成Verical而子元素在Add进入Sizer
的时候设置为
wxALIGN_CENTER_VERICAL//horizontal同理
所以出现问题的地方为:
文件uibase.cpp//133L//bSizer3->Add(m_panel14,1,wxEXPAND|wxALIGN_BOTTOM|wxALL,5);
//修改为
bSizer3->Add(m_panel14,1,wxEXPAND|wxALL,5);
//357L//bSizer57->Add(m_staticText32,0,wxALIGN_CENTER_VERTICAL|wxALL,5);
//修改为
bSizer57->Add(m_staticText32,0,wxALL,5);
//363L//bSizer56->Add(m_staticText31,0,wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxL
EFT,5);
//修改为
bSizer56->Add(m_staticText31,0,wxTOP|wxBOTTOM|
wxLEFT,5);
//366L//bSizer56->Add(m_textCtrlTransactionFee,0,wxALL|wxALIGN_CENTER_VERTICAL,5);
//修改为
bSizer56->Add(m_textCtrlTransactionFee,0,wxALL,5);
//461L//bSizer60->Add(bSizer61,0,wxALIGN_RIGHT|wxEXPAND,5);
//修改为bSizer60->Add(bSizer61,0,wxEXPAND,5);
//1751L//bSizer81->Add(m_textCtrl1,0,wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL,5);
//修改为
bSizer81->Add(m_textCtrl1,0,wxALL|wxEXPAND,5);
//bSizer81->Add(m_textCtrl2,0,wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL,5);
//修改为
bSizer81->Add(m_textCtrl2,0,wxALL|wxEXPAND,5);
同时,在该文件中有其他瑕疵点:
//463L//this->SetSizer(bSizer60);
//修改为
this->SetSizerAndFit(bSizer60);
//604L//this->SetSizer(bSizer21);
//修改为
this->SetSizerAndFit(bSizer21);
//1786L//this->SetSizer(bSizer79);
//修改为
this->SetSizerAndFit(bSizer79);
//fgSizer1=newwxFlexGridSizer(3,2,0,0);
//注:
这里很
//修改为
fgSizer1=newwxFlexGridSizer(4,2,0,0);
所以这里改成4行2列在uibase.h中修改//715L
CGetTextFromUserDialogBase(wxWindow*parent,wxWindowIDid=wxID_ANY,constwxString&title=wxEmptyString,constwxPoint&poswxDefaultPosition,constwxSize&size=wxSize(403,138),longstyle=wxDEFAULT_DIALOG_STYLE);
//修改为
CGetTextFromUserDialogBase(wxWindow*parent,wxWindowIDid=wxID_ANY,constwxString&title=wxEmptyString,constwxPoint&poswxDefaultPosition,constwxSize&size=wxSize(403,138),longstyle=wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER);
窗口的大小
dialog就需要使用EndModal()或者是Destroy()来关闭
Close();
//Destroy();
//改为
//Close();
Destroy();
//1123L//Close();
//改为
EndModal(true);
//1228L//Close();
//改为
EndModal(false);
//1254L//Close();
//改为
EndModal(true);
//1466L//Close();
//改为
EndModal(true);
//1479L//Close();
//改为
EndModal(true);
//1510L//Close();
//改为
EndModal(false);
//Close();
//改为
EndModal(true);
三、运行前的小准备(根据自己需要修改)我们都知道,bitcoin默认会去寻找(windows
)C:
\Users\\AppData\Roaming目录下,新建一个bitcoin\
目录来存放bitcoin的各种东西如节点,日志,数据库文件等等。
为了不和现在电脑上正常运行的目录混淆,我们可以修改一下代码,让这个试验的bitcoin源码的存储指向其他文件夹。
在main.cpp//1353L//strDir=strprintf("%s\\Bitcoin",getenv("APPDATA"));
//修改为
strDir=strprintf("%s\\Bitcoin-debug",getenv("APPDATA"));
//1364L//strDir=strprintf("%s\\Bitcoin",strAppData.c_str());
//修改为
strDir=strprintf("%s\\Bitcoin-debug",strAppData.c_str());
这个样子,此时运行这个bitcoin项目的代码的时候,就会存储在C:
\Users\\AppData\Roaming\bitcoin-debug而不是存储在C:
\Users\\AppData\Roaming\bitcoin这个官方的目录
了,之后研究和调试都很方便,防止数据弄混。
四、运行
此时终于可以开始编译运行了。
如果没有任何问题,你将看到:
这个界面。
此时你就是已经成功编译并运行的bitcoinv0.1
源码了棒!