1、在win10vs上编译运行bitcoinv01源码下在 win10 vs 2015 上编译运行 bitcoin v0.1 源码 (下)一篇文章详细描述的如何让 bitcoin v1.0 源码通过编译,本篇将描述第一次运行过程中修改出现过的问题。数据库 dll 加载出错不清楚这个问题是不是个例, bitcoin 使 用的数据库 Berkeley DB v4.8 在 oracle 官网上下载安装后1. 使用 release 版本的 lib 和 dll 直接使用 release 版本的 dll在 debug 下运行 bitcoin 源码会第 184 行左右,在/ Clear andReadAtCur
2、sor 函数中的 free 处崩溃:free memorymemset(datKey.get_data(), 0, datKey.get_size();memset(datValue.get_data(), 0,datValue.get_size();free(datKey.get_data(); / 很可能在这个地方崩溃free(datValue.get_data();产生的原因是 :HEAPbitcoin-v0.1.exe: Invalid address specified to RtlValidateHeap( 01640000, 03177208 )呃其实我不知道产生的原因是什么,简
3、单的搜索可能的原 因是:在不同模块(工程)之间传递 C+ 类,而这两个模 块用了不同的运行时库( Runtime Library )设置。例如: EXE 模块调用 DLL 模块里传递 C+ 类的函数,但Debug 是 Multi-threaded Debug (/MTd) )方式编译,而EXE 模块使用动态链接( Release 是 Multi-threaded DLL (/MD)、Debug 是 Multi-threaded Debug DLL (/MDd) )方 式编译。HEAPxxx.exe:Invalid Address specified toRtlValidateHeap 错误的解
4、决方法总结 我也不清楚是不是这个原因啦,这个问题先搁置下- 使用2lebug版本的lib和 dll 直接使用安装包中自带的那个 libdb48d.lib 和libdb48d.dll 是在 vs2005 或者是 vs2008 平台下构建的。它 在构建这个 libdb48.dll 和 libdb48d.dll 的时候分别依赖了8.0.50727.762 版本的 libdb48.dll 和 libdb48d.dll 。这丫是个 历史遗留问题,参考: Side-by-side assembly 这 2 个 dll 只 会在安装 vs2005 和 vs2008 的时候存在, 以后都只会以兼容 库的形式存
5、在。但是关键是这个现在绑定版本,所以就造成 了 crash 。解决方法就是下面的第 3 点,重新编译。至于berkeley dbrelease 为什么会自动存在,那是因为我在安装 的时候安装包把安装的 路径 bin 填写到了 path 变量当中, 而在这个 bin 目录下已经提供了 8.0.50727.762 版本的libdb48.dll 。但是它丫却没有在 bindebug 目录下提供libdb48d.dll 。所以就造成了 release 能运行, 但是因为其他 原因崩溃,而 debug 是直接运行不起来的。3. 解决方法因为安装包中的 release 和 debug 都无法运行, 所以只
6、能自己编译出 Berkeley DB 的 lib 和 dll 假设现在的berkeley db 的根目录是 那么在db-4.8.30build_windows 目录下可以找到Berkeley_DB.sln 打开它向上兼容后,进行项目构建,然后 将一个 example 项目设为主项目进行运行。 如果能运行成功 就是构建成功并且能够正常运行。此时在db-4.8.30build_windowsWin32Debug 目录下可以发现libdb48d.lib 和 libdb48d.dll 这两个文件。而这两个文件就 是在自己平台上编译出来的动态链接库。 之后把 bitcoin 源码 的关于 Berkele
7、y DB 的依赖库修改为新的路径, 然后就可以 正常运行了。这里修改的路径就是$(BDBPath)db-4.8.30build_windowsWin32Debug ( 参照 上一篇 )然后把 libdb48d.dll 拷贝到 bitcoin 项目的 libs 目 录下。二、wxWidgets 高版本兼容问题ps:以下的崩溃很可 能是因为 wxWidgets 版本高的原因, 要是版本低于 3.0/ 或者2.8?(可能 )很可能就没这些问题 1. 运行崩溃崩溃的原因主 要是由于在 wxWidgets 3.0 还是 2.8 收紧了 Sizer 布局的Align 规则检查的严格性。当布局的 flag
8、出现: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
9、, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);/ 修改为bSizer57-Add(m_staticText32, 0, wxALL, 5);/ 363L /bSizer56-Add(m_staticText31, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5);/ 修改为bSizer56-Add(m_staticText31, 0, wxTOP | wxBOTTOM |wxLEFT, 5);/ 366L /bSizer56-Add(m_textCtrlTransactionFee, 0, wxALL|wx
10、ALIGN_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,
11、 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(bSiz
12、er21);/ 1786L /this-SetSizer(bSizer79);/ 修改为this-SetSizerAndFit(bSizer79);/fgSizer1 = new wxFlexGridSizer(3, 2, 0, 0);/ 注:这里很/ 修改为fgSizer1 = new wxFlexGridSizer(4, 2, 0, 0);所以这里改成 4 行 2 列 在 uibase.h 中修改 / 715LCGetTextFromUserDialogBase(wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& titl
13、e = wxEmptyString, const wxPoint& pos wxDefaultPosition, const wxSize& size = wxSize(403,138), long style = wxDEFAULT_DIALOG_STYLE);/ 修改为CGetTextFromUserDialogBase(wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos wxDefaultPosition, const wxSize& s
14、ize = wxSize(403, 138), long style = 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();/ 改
15、为EndModal(true);/ 1479L / Close();/ 改为EndModal(true);/ 1510L / Close();/ 改为EndModal(false);/ Close();/ 改为EndModal(true);三、运行前的小准备 (根据自己需要修改 )我们都知道, bitcoin 默认会去寻找 (windows)C:UsersAppDataRoaming 目录下,新建一个 bitcoin目录来存放 bitcoin 的各种东西如节点,日志,数据库文件 等等。为了不和现在电脑上正常运行的目录混淆,我们可以 修改一下代码, 让这个试验的 bitcoin 源码的存储指向其
16、他文 件夹。在 main.cpp/ 1353L /strDir = strprintf(%sBitcoin, getenv(APPDATA);/ 修改为strDir = strprintf(%sBitcoin-debug, getenv(APPDATA);/ 1364L /strDir = strprintf(%sBitcoin, strAppData.c_str();/ 修改为strDir = strprintf(%sBitcoin-debug, strAppData.c_str();这个样子, 此时运行这个 bitcoin 项目的代码的时候, 就会存 储在 C:UsersAppDataRoamingbitcoin-debug 而不是存 储在 C:UsersAppDataRoamingbitcoin 这个官方的目录了,之后研究和调试都很方便,防止数据弄混。四、运行此时终于可以开始编译运行了。如果没有任何问题,你将看 到: 这个界面。此时你就是已经成功编译并运行的 bitcoin v0.1源码了棒!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1