• 学习SDL - [第三方开发库]

    2009-01-28

    Tag:SDL wesnoth

    过年好,好久没写blog了。回家了,终于松了一口气,这几天看看电视、看看书,过得很惬意。

    这些天在玩一个叫“ wesnoth”的开源游戏,嗯,是个六边格战棋游戏,开源的。玩了几关,感觉不错,于是便研究了一下。

    其主页为 http://www.wesnoth.org/

    使用SDL开发的,所以支持跨平台使用。

    以前没听过SDL,google了一下,找到不少资料,csdn上有个兄弟已经写了一套完整的教程

    http://www.cppblog.com/lf426/category/6107.html?Show=All

    写得不错。但是对mingw和cygwin没有详细的说明,配置起来有些麻烦,还是推荐用vs2008Express版作为学习开发的环境。

    其实我这么说的主要原因在于:我老家的机器配置太低了,只有PIII800,连电影看着都磕磕绊绊的,跑起vs着实慢了些,于是我就暂时以msys+mingw替代vs来开发,无奈由于不熟,折腾了好长时间也没有结果,只好放弃改用vs。

    趁着这两天有空,仔细研究一下SDL,自己也写个跨平的东东娱乐一下,哈哈。

     

  • 最近一段时间项目组很忙,一直没时间写blog。

    前一段时间在学习单元测试,简单地学习了一下cppunit。虽然功能强大,支持多种界面,但感觉使用起来还是很麻烦的。首先要包含各式各样的头文件,确保lib被正确导入。然后要将被测试的代码包含进来,同时还要注意避免测试代码污染。总之光是创建一个测试project就要消耗不少精力,若是严格按照TDD方法来做,则更加繁琐。我只是想为我自己的代码加入单元测试使之更加健壮而已,感觉只起到了反效果。

    而且关于cppunit的资料也很少,google搜索半天也就只有那么几篇入门文章,都互相抄来抄去的。仅仅介绍了初步使用方法,至于如何正确有效的使用,常见的问题等完全摸不到头绪,只能自己研究。因为我没有多少时间,所以只用了一两次便放弃了。

    后来我无意中看到了GoogleTest,基于对google产品一向的好感,我便尝试了一下。立刻有一种相见恨晚的感觉,这个东东简直太棒了!

    结构简单,体积小,使用方便,跟cppunit相比就好象是法拉利与人力黄包车之间的区别一样。我只是简单的学习了15分钟左右,就基本上掌握了使用方法,并成功的运用到现有的代码当中。我不得不说,google的东西就是不一样啊~~

     

     

  • 以前没用过单元测试工具,这几天开始学习一下CppUnit的使用。google了几个教程,一步一步做下来基本都会了,算是初步入门吧。于是自己也照葫芦画瓢试了一下,这一试,问题来了。无论如何,我写的测试代码都无法编过去,老是有link错误说是我的目标类有问题。不解,于是仔细研究网上前辈们提供的demo。

    原来,测试类本身必须设置Dependencies 为目标类所在的工程或者包含目标类的源码才可编译通过。明明已经能够在代码中指定了#include,却仍然必须在工程里包含目标类才行,实在很奇怪。

    虽然问题解决了,但仍然不解中,继续研究。 

  • 因为工作原因,研究了一下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发布后,我第一时间内将其下载下来。

    官方下载页面也还是一如既往的简洁,开始安装后需要从网络上下载文件,下载结束后部署也同时完成,省却了安装的麻烦。 Google的产品一向是以简洁著称,这也是我喜欢使用它们的最大理由。

    打开Google Chrome,没有标题栏,没有菜单栏,也没有状态栏,只有标签栏和整合了工具的地址栏。整个界面异常清爽,主题突出,明明白白地告诉使用者:“我就是专职的浏览器!”。

    优点:

    1. 启动速度快:

    无论是ie或firefox,从你双击其图标到应用程序启动总要经过那么几秒才行,而Chrome几乎是立刻启动起来。当然这和浏览器的构架也有关系,如果光是启动内核,无论什么浏览器都可以瞬间完成,但是如果附加上各式各样的插件,启动速度自然快不起来。

    2. 流畅

    不同标签切换,下载,打开新页面,无论什么操作都异常流畅,完全没有停滞的感觉。 

    3. 导入功能

    轻松导入ie和firefox的设置和收藏,延续自己的使用习惯。 

    4. 强大的历史记录

    最近关闭的页面有预览,其他的浏览历史全都按时期排布,同时人性化的标注了上下午。

     

    缺点:

    1. 测试版

    很多功能尚未完善,仅能做测试使用。许多常用的网站无法正常打开。

    2. 经常崩溃

    虽然会崩溃,但是有很可爱的提示,不会像其他的程序那样弹出个冷冰冰的对话框。

     

      不知道是我家这边的小区宽带有问题,还是别的什么原因,我始终打不开google Chrome的主页。不得已,在公司先下载下来然后发回家安装。今天终于用上了。

  • 代码来源:
    官方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的源码,因为遍不过去无法调试,很不爽,所以多花了点时间研究一下,如果有什么不正确或需要补充的地方请与我联系。