在完成Gens源代码分析之后,我们对Gens源代码进行了裁剪。裁剪过程是曲折而复杂的,但对于我来说,无疑是一次很大的收获,怎样分析一个软件的内部结构,怎样将一个软件的功能与它的源代码对应起来,怎样将一个软件的结构层次化,以及怎样对一个工程进行管理。以下是裁剪工作的一个简要的概述:
一,确定裁剪的部分功能
CDROM, 目前大部分的嵌入式手持设备都不支持光驱
OPENGL, 游戏对图形显示的要求用SDL库可以满足
DEBUG, 对于普通用户, 这个功能用不到
WIN32_UI, 对于Linux操作系统, WIN32_UI部分可以删除
二,工作环境和工具
操作系统:Linux, version 2.6.27.9-159.fc10.i686
终端:GNU bash, version 3.2.39(1)-release-(i386-redhat-Linux-gnu)
编译工具:gcc, version 4.3.2
工程管理工具集:autotools
三,裁剪和修改过程
1,裁剪和修改代码
被删除的文件:
/src/mp3_dec/*,/src/gens/netplay/*, /src/gens/debugger/*,
/src/gens/ui/win32/*,/src/gens/video/v_draw_sdl_gl.cpp,
/src/gens/input/input_win32_keys.h,/src/gens/video/v_draw_sdl_gl.hpp,
/src/gens/emulator/g_main_win32.hpp,/src/gens/emulator/g_main_win32.cpp
被修改的文件:
/pixmaps/Gens2.ico,/src/gens目录下除gens_core之外的几乎所有文件
2,编译过程
在编译开始之前先来了解一下auto tools,这是对具体工程进行管理的工具集,包括以下工具:automake ,autoscan,aclocal,autoheader,autoconf等工具。
具体过程如下:
(1) 编写每个目录下的Makefile.am
例如:./Makefile.am
AUTOMAKE_OPTIONS = foreign
//Automake 主要是帮助开发 GNU 软件的人员来维护软件,所以在执行Automake 时,会检查目录下是否存在标准GNU软件应具备的文件,例如 'NEWS'、'AUTHOR'、 'ChangeLog' 等文件.设置为foreig时,Automake会改用一般软件的标准来检查。
SUBDIRS = src pixmaps xdg//表明有几个子目录需要被编译
BUILT_SOURCES =
CLEANFILES =
include $(srcdir)/git_version.am
love:
@echo What is love?
@echo Baby don/'t hurt me.
@echo Don/'t hurt me.
@echo No more.
(2)用autoscan提取每个目录下的文件信息,生成文件configure.scan,修改configure.scan,把它改名为configure.in.这是autoconf的模板文件,包含了工程的配置信息。
(3)用aclocal将configure.in里的用到的宏拷贝到工程里来,结果生成 autom4te.cache,这是一个临时目录,只是用来加快宏展开的。aclocal.m4 是configure.in中用到的宏的定义。
(4)用autoheader生成config.h.in,这是config.h的模板文件,配置头文件(config.h)是用来定义在C/C++程序中可以引用的宏,像模块的名称和版本号,哈希表等等。
(5)创建几个必要的文件。
u README:描述模块的功能、用法和注意事项等。
u NEWS:描述模块最新的动态。
u AUTHORS:模块的作者及联系方式。
u ChangeLog:记录模块的修改历史,它有固定的格式。
(6)用autoconf调用m4展开configure.in中的宏,生成configure脚本,这个脚本是最终运行的脚本。
(7)调用automake以每个目录下Makefile.am为模板产生相应的Makefile.in文件
(8)调用./configure以每个目录下的Makefile.in为模板生成相应的Makefile
3,最后的调试过程如下:
Make时出现四类错误
(1),文件找不到[1]
In file included from ./ui/gtk/gens/gens_window.hpp:53,
from ui/common/gens/gens_menu_callbacks.cpp:31:
./macros/hashtable.hpp:35:29: tr1/unordered_map: 没有那个文件或目录
原因:gcc 3.4.0 中的哈希表不是 tr1/unordered_map
解决:换成 gcc 4.3.2
(2),汇编出错[1]
gens_core/gfx/blit_hq2x_16.asm:1959: error: phase error detected at end of assembly.
原因:汇编出现的错误
解决:将那一行的汇编代码NASM = /usr/bin/nasm -O3改为NASM = /usr/bin/nasm -O1
(3),Makefile中宏的错误[3]
make[4]: Entering directory `/home/lc/gens-cut1/src/gens'
test -z "/usr/local/bin" || @MKDIR_P@ "/usr/local/bin"
/bin/sh: @MKDIR_P@: command not found
原因:@MKDIR_P@没有替换的对象
解决:将/src/gens/Makefile中的MKDIR_P = @MKDIR_P@ 修改为MKDIR_P = mkdir -p --,并删除mkdir_p=mkdir -p --.
相同的错误出现在/pixmaps,/xdg的编译过程中,处理方法同上。
(4),文件内部出错[42]
由于裁剪过程中删除了部分的文件,但这些文件有可能包含在其他文件的头文件中,当编译那些文件时,就会出错:XX文件找不到,XX 变量未定义。
解决:找到相应的位置删除那些变量和相应的头文件的包含语句。
四,结果(略)