-
过年好,好久没写blog了。回家了,终于松了一口气,这几天看看电视、看看书,过得很惬意。
这些天在玩一个叫“ wesnoth”的开源游戏,嗯,是个六边格战棋游戏,开源的。玩了几关,感觉不错,于是便研究了一下。
使用SDL开发的,所以支持跨平台使用。
以前没听过SDL,google了一下,找到不少资料,csdn上有个兄弟已经写了一套完整的教程
http://www.cppblog.com/lf426/category/6107.html?Show=All
写得不错。但是对mingw和cygwin没有详细的说明,配置起来有些麻烦,还是推荐用vs2008Express版作为学习开发的环境。
其实我这么说的主要原因在于:我老家的机器配置太低了,只有PIII800,连电影看着都磕磕绊绊的,跑起vs着实慢了些,于是我就暂时以msys+mingw替代vs来开发,无奈由于不熟,折腾了好长时间也没有结果,只好放弃改用vs。
趁着这两天有空,仔细研究一下SDL,自己也写个跨平的东东娱乐一下,哈哈。
-
googletest很好用 - [单元测试框架]
2008-12-13
最近一段时间项目组很忙,一直没时间写blog。
前一段时间在学习单元测试,简单地学习了一下cppunit。虽然功能强大,支持多种界面,但感觉使用起来还是很麻烦的。首先要包含各式各样的头文件,确保lib被正确导入。然后要将被测试的代码包含进来,同时还要注意避免测试代码污染。总之光是创建一个测试project就要消耗不少精力,若是严格按照TDD方法来做,则更加繁琐。我只是想为我自己的代码加入单元测试使之更加健壮而已,感觉只起到了反效果。
而且关于cppunit的资料也很少,google搜索半天也就只有那么几篇入门文章,都互相抄来抄去的。仅仅介绍了初步使用方法,至于如何正确有效的使用,常见的问题等完全摸不到头绪,只能自己研究。因为我没有多少时间,所以只用了一两次便放弃了。
后来我无意中看到了GoogleTest,基于对google产品一向的好感,我便尝试了一下。立刻有一种相见恨晚的感觉,这个东东简直太棒了!
结构简单,体积小,使用方便,跟cppunit相比就好象是法拉利与人力黄包车之间的区别一样。我只是简单的学习了15分钟左右,就基本上掌握了使用方法,并成功的运用到现有的代码当中。我不得不说,google的东西就是不一样啊~~
-
使用cppunit发现的怪事情 - [单元测试框架]
2008-10-19
以前没用过单元测试工具,这几天开始学习一下CppUnit的使用。google了几个教程,一步一步做下来基本都会了,算是初步入门吧。于是自己也照葫芦画瓢试了一下,这一试,问题来了。无论如何,我写的测试代码都无法编过去,老是有link错误说是我的目标类有问题。不解,于是仔细研究网上前辈们提供的demo。
原来,测试类本身必须设置Dependencies 为目标类所在的工程或者包含目标类的源码才可编译通过。明明已经能够在代码中指定了#include,却仍然必须在工程里包含目标类才行,实在很奇怪。
虽然问题解决了,但仍然不解中,继续研究。
-
Crypto++与VS2008的小bug - [源码解读]
2008-10-17
因为工作原因,研究了一下Crypto++。
其主页无法访问,幸好源码是放在SourceForge上面,最新版本为cryptopp552。下载下来,build。发现了一个奇怪的错误(我用的是vs2008):
------ Build started: Project: dlltest, Configuration: Debug Win32 ------
Compiling...
dlltest.cpp
c:\program files\microsoft visual studio 9.0\vc\include\intrin.h(204) : error C2373: '_InterlockedCompareExchange' : redefinition; different type modifiers
c:\program files\microsoft visual studio 9.0\vc\include\memory(995) : see declaration of '_InterlockedCompareExchange'
简直是莫名其妙,但是其最关键的cryptlib却能编译通过,怪了。
上网一搜,有位外国同学也遇到了同样的问题
http://groups.google.com/group/cryptopp-users/browse_thread/thread/81eecd4f436cbbb3
http://code.logos.com/blog/2008/08/error_c2373_after_upgrading_to_vs2008_sp1.html
即在要编译的project里面加入如下两行即可:
#define _DO_NOT_DECLARE_INTERLOCKED_INTRINSICS_IN_MEMORY
#include <intrin.h>
原来是vs2008sp1的小bug,终于可以成功编译了,仔细研究一下。
-
从去年这个时候起我就一直在用7zip,对其评价还是很高的。最近决定深入了解一下,看看其源代码学习一下。
其主页为 http://www.7-zip.org/,其上提供了二进制文件和源代码的下载,全都是链接到sourceforge上的。
其项目托管主页为
http://sourceforge.net/projects/sevenzip/
7zip的代码主要是7zip和LZMA,前者是平台客户端,后者是SDK。粗略地看了一下readme,里面包括了各个C和C++版本的算法代码以及各个平台的客户端代码。我准备先看win32的(其实linux的我也看不太懂)。
-
Google Chrome使用感受 - [软件]
2008-09-04
Google Chrome发布后,我第一时间内将其下载下来。
官方下载页面也还是一如既往的简洁,开始安装后需要从网络上下载文件,下载结束后部署也同时完成,省却了安装的麻烦。 Google的产品一向是以简洁著称,这也是我喜欢使用它们的最大理由。
打开Google Chrome,没有标题栏,没有菜单栏,也没有状态栏,只有标签栏和整合了工具的地址栏。整个界面异常清爽,主题突出,明明白白地告诉使用者:“我就是专职的浏览器!”。
优点:
1. 启动速度快:
无论是ie或firefox,从你双击其图标到应用程序启动总要经过那么几秒才行,而Chrome几乎是立刻启动起来。当然这和浏览器的构架也有关系,如果光是启动内核,无论什么浏览器都可以瞬间完成,但是如果附加上各式各样的插件,启动速度自然快不起来。
2. 流畅
不同标签切换,下载,打开新页面,无论什么操作都异常流畅,完全没有停滞的感觉。
3. 导入功能
轻松导入ie和firefox的设置和收藏,延续自己的使用习惯。
4. 强大的历史记录
最近关闭的页面有预览,其他的浏览历史全都按时期排布,同时人性化的标注了上下午。
缺点:
1. 测试版
很多功能尚未完善,仅能做测试使用。许多常用的网站无法正常打开。
2. 经常崩溃
虽然会崩溃,但是有很可爱的提示,不会像其他的程序那样弹出个冷冰冰的对话框。
不知道是我家这边的小区宽带有问题,还是别的什么原因,我始终打不开google Chrome的主页。不得已,在公司先下载下来然后发回家安装。今天终于用上了。
-
在vs2008下编译eMule-VeryCD工程 - [源码解读]
2008-09-04
代码来源:
官方eMule-VeryCD源码包
http://download.verycd.com/eMule-VeryCD-src.rar
编译好的第三方库,来http://www.verycd.com/groups/eMuleDev/209863.topic
http://download.VeryCD.com/emule071112_libsForVS2005.rar
编译环境:
WindowsXPsp3CN
VC2008EN + SP1
ATL Server http://www.codeplex.com/AtlServer
修改过程:(只修改error的部分,警告看着不爽自己整)
1. 解压缩源码包,其中src目录下为emule源码。
2. vs2008打开emule.sln,首先是转换工程向导,转换之。
3. 首次build,会提示你如下错误。
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\..\src\mfc\afximpl.h(631) : error C2059: syntax error : '<L_TYPE_raw>'
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\..\src\mfc\afximpl.h(631) : error C2238: unexpected token(s) preceding ';'
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\..\src\mfc\afximpl.h(635) : error C2059: syntax error : '<L_TYPE_raw>'
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\..\src\mfc\afximpl.h(635) : error C2238: unexpected token(s) preceding ';'
这个错误是由于WINVER定义不正确造成的,编辑stdafx.h,更改代码如下:
#ifndef WINVER
#define WINVER 0x0501
#endif
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
4. 重新build,又会有一大坨error,其中最多的是
error C2011: 'tagMENUINFO' : 'struct' type redefinition
结构重复定义,查看winuser.h就会发现如下定义
#if(WINVER >= 0x0500)
...
typedef struct tagMENUINFO
{
DWORD cbSize;
DWORD fMask;
DWORD dwStyle;
UINT cyMax;
HBRUSH hbrBack;
DWORD dwContextHelpID;
ULONG_PTR dwMenuData;
} MENUINFO, FAR *LPMENUINFO;
typedef MENUINFO CONST FAR *LPCMENUINFO;
还是WINVER的问题,编辑TitleMenu.h,更改代码如下:
#if (WINVER < 0x0500)
typedef struct tagMENUINFO
{
DWORD cbSize;
DWORD fMask;
DWORD dwStyle;
UINT cyMax;
HBRUSH hbrBack;
DWORD dwContextHelpID;
ULONG_PTR dwMenuData;
} MENUINFO, FAR *LPMENUINFO;
typedef MENUINFO CONST FAR *LPCMENUINFO;
#endif
或者直接注释掉也可以
5. 重新build(很可能你改完了上面的代码后,上一次build仍没有结束,要毫不犹豫地cancel),再次出现一大坨error,总共有两类()
1>.\UPnpNat.cpp(706) : error C2440: '=' : cannot convert from 'const char *' to 'char *'
1>.\SharedFilesCtrl.cpp(585) : error C2039: 'bWin95' : is not a member of 'AUX_DATA'
1> C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\..\src\mfc\afximpl.h(54) : see declaration of 'AUX_DATA'
1>SearchListCtrl.cpp
1>.\SearchListCtrl.cpp(1729) : error C2039: 'bWin95' : is not a member of 'AUX_DATA'
1> C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\..\src\mfc\afximpl.h(54) : see declaration of 'AUX_DATA'
其中第一个很好改,强制转换类型即可。
至于第二种错误,AUX_DATA中已不再包含成员bWin95,如有需要参与运算的部分则bWin95=0,具体请自行google。
这个改起来也很容易,将所有bWin95的部分注释掉即可,其多半是参与if判断,需要的地方统统取FALSE即可。涉及到的文件共有14个
修改举例
lf.lfQuality = afxData.bWin95 ? NONANTIALIASED_QUALITY : ANTIALIASED_QUALITY;
改为
lf.lfQuality = ANTIALIASED_QUALITY;
if (!afxData.bWin95 && iItem >= 0)
改为
if (iItem >= 0)
6. 改好之后再次build,出现4条error
>.\EncryptedStreamSocket.cpp(361) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>.\EncryptedStreamSocket.cpp(492) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>.\EncryptedStreamSocket.cpp(590) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>.\Emule.cpp(314) : fatal error C1189: #error : "You are using an MFC version which may require a special version of the above function!"
前三条纯粹是写法不正确,变量前面竟然没有写类型,为之一一补充上即可。
第二种是宏警告,意思是VS版本不正确之类的。在其前面的条件中补充上
|| _MFC_VER==0x0900
即可,总共有2处
7. 再次build,这次出现的错误算是比较常见的,不再列举
去掉stdafx.h里的以下几行
#ifndef _USE_32BIT_TIME_T
#define _USE_32BIT_TIME_T
#endif
8. build, 提示link错误
ResizableLib.lib(ResizableDialog.obj) : error LNK2019: unresolved external symbol "public: class CMenu * __thiscall CWnd::GetMenu(void)const " (?GetMenu@CWnd@@QBEPAVCMenu@@XZ) referenced in function "protected: int __thiscall CResizableDialog::OnCreate(struct tagCREATESTRUCTW *)" (?OnCreate@CResizableDialog@@IAEHPAUtagCREATESTRUCTW@@@Z)
ResizableLib.lib(ResizableSheet.obj) : error LNK2001: unresolved external symbol "public: class CMenu * __thiscall CWnd::GetMenu(void)const " (?GetMenu@CWnd@@QBEPAVCMenu@@XZ)
ResizableLib.lib(ResizableSheet.obj) : error LNK2019: unresolved external symbol "public: long __thiscall CWnd::SendMessageW(unsigned int,unsigned int,long)" (?SendMessageW@CWnd@@QAEJIIJ@Z) referenced in function "public: void __thiscall CResizableSheet::RefreshLayout(void)" (?RefreshLayout@CResizableSheet@@QAEXXZ)
这里说明一下,emule的源码目录中,其他几个像ResizableLib,crypto51是其所依赖的第三方库,跟emule工程一样需要重新转换 并编译。但是为了省事起见,这里直接使用了他人编译好的lib库(在前面有说明)。但是尽管如此,有一部分还是需要重新编译一下的。
需要重新转换并编译ResizableLib这个工程,然后在工程属性里面将Debug和Release的”Chartacter Set“设置为“Use Unicode Character Set”,rebuild之后将生成的ResizableLib.lib分别copy至DebugUnicode和ReleaseUnicode目录(修 改工程属性直接生成到这两个目录里也是一样的)。
再次编译emule工程即可通过。
另外需补充一点,VS2008如果没装sp1补丁有一个地方遍不过去,因为懒得查,我就忽略了。
再有,VS2008默认安装时没有包括ATLServer库(现在已开源)的,需要去官方下载,解压后制定inc的路径即可。
至此大功告成,其余的部分请自行研究吧。我也是刚刚开始看emule的源码,因为遍不过去无法调试,很不爽,所以多花了点时间研究一下,如果有什么不正确或需要补充的地方请与我联系。








