现在的位置: 首页 > 综合 > 正文

Make WinPooch

2014年02月21日 ⁄ 综合 ⁄ 共 2836字 ⁄ 字号 评论关闭
从sf上下了WinPooch(http://sourceforge.net/projects/winpooch)的源码之后,一直想研究一下并改一改,要改就得编译。本来预计很快结束的过程,结果变成从中午到晚上长时间的鏖战,所幸最后还是编译完了。
拿到源代码之后先看到了MakeFile文件,打开一看就找到gcc、grep这些熟悉的名词,第一感觉就是肯定得用cygwin下的Make了。但一弄就出错,提示找不到tchar.h等头文件,在cygwin下确实也没有发现,但在VS的目录下找到了,于是天真的以为改MakeFile就能解决问题,我设了VPath,还是没用。折腾了一会没辙,第一回合结束。
既然走不下去了,那就只能上网搜了,所幸碰巧看到了WinPooch在SF上的MailList(以前从来没仔细看过),果然也有人问编译的问题,Dev给出了答案:1、得用MingW(SF中有)来Make;2、还得下FreeImage的类库。当时就火了,为什么不在Readme里面说清楚,害我找半天。
OK,下了MingW,安装又异常麻烦。因为下下来的只是一个壳,你选中Components它再下。等了半天下完了,环境变量里添加MingW/bin,尝试Make,还是不行,把下来的FreeImage包里的Dist下面的FreeImage.h添到MingW下面的include里,把DLL和LIB拷到MingW/Lib(后来证明拷DLL和LIB没有任何用处),Make仍旧不行。不过这次不是头文件的问题,问题出在FreeImage.h上,几个定义与Windows.h有冲突。第二回合结束。
又做不下去了,只能在google里胡乱去找。这次FreeImage(也是SF的项目)的MailList里碰巧在前几面就看到别人有相同的问题,解决办法就是在include <freeimage.h>之前添加#define _WINDOWS_,FreeImage的开发人员还把问题归到到MingW上,算了,不说了。在application.c、picbtnctl.c、splash.c这三个文件前加上#define _WINDOWS_,再次编译,终于能哗哗哗的生成.o文件了,就在我以为胜利就在前方时又不行了。提示Perl buildcounter.pl version.h(为了提高版本号)找不到命令,果然MingW下面没有Perl而CygWin下面有,再晕。两个功能不差不多吗?就不能取长补短一下。赶紧设了CygWin/bin到环境变量的Path里面,再Make,仍然不行,这次提示的错误出在链接过程中,都与FreeImage有关。把DLL和LIB移来移去还是错(不过能确定GCC确实在MingW的LIB下找),又走不了了。第三回合结束。
在这里不得不佩服Dev,一个用Win32API写的程序用Linux下的一套东西编译再在Windows下运行,你在VC里面做不就行了,费那事儿干嘛!把我折腾的死去活来的,晚上还只吃了泡面,可恶。想到调试又不好调,郁闷了。
找来找去没想法的时候,突然在网上看到一篇GCC的文章,讲到GCC链接的链接库都是.a后缀的,-lxyz相当于链接libxyz.a。估计是还得拿源代码编译成.a格式的,在FreeImage下找到README.minGW,终于找到解决方法:
This file explains how to create a FreeImage.a file from the FreeImage DLL, so that it can be linked with the MinGW / LCC WIN 32 / GNU gcc C compiler.
 
1) Open a DOS shell (run the program cmd.exe)
 
2) Add the MinGW path to your environment variable :
 
C:/>set PATH=%PATH%;C:/mingw32/bin;
 
3) Creates a .def file from the FreeImage DLL
 
C:/>pexports freeimage.dll | sed "s/^_//" > freeimage_gcc.def
 
4) Creates the FreeImage.a file
 
C:/>dlltool -U -d freeimage_gcc.def -l freeimage.a
 
Note : you may also use a batch file to automate this process :
 
--- FIExport.bat ---
set PATH=%PATH%;C:/mingw32/bin;
pexports freeimage.dll | sed "s/^_//" > freeimage_gcc.def
dlltool -U -d freeimage_gcc.def -l libfreeimage.a
--- FIExport.bat ---
可Pexports没有找到,OK,从网上下,很快也找到了(http://www.emmestech.com/software/cygwin/pexports-0.43/pexports-0.43.zip)。解压后将Bin里面的pexports拷到MingW下的Bin里,按着上述方法生成FreeImage.a,再次拷到MingW/lib里,Make,仍然不行,查看GCC的帮助,把FreeImage.a,更名为libfreeimage.a,再次Make。在心上窜下跳了N次之后,没有任何提示的结束了Make过程,WinPooch.exe终于出现了!可我已经被折磨的激动不起来了。要运行的话还得把Language目录和FreeImage.dll拷到同目录下。
总的说来,还算比较幸运,虽然花了不少时间,但第一次Make了一个比较大的软件。总结一下,还是有问题就google,MailList、Forum也很重要,是在不行就Mail给作者。然后有必要弄清GCC、Makefile这套东西,这才是Linux的精华。最后,佩服Dev的做法。
 
附,解决问题步骤简要版:
1、下winpooch、cygwin、mingw、freeimage、pexports
2、安装cygwin、mingw,把pexports.exe拷到mingw/bin下,path里面添加cygwin/bin、mingw/bin。
3、按FreeImage下找到README.minGW,按其中步骤生成freeimage.a,把freeimage.h拷到mingw/include里,freeimage.a更名为libfreeimage.a拷到mingw/lib
4、改源代码,在application.c、picbtnctl.c、splash.c这三个文件前加上#define _WINDOWS_。
5、Make
6、如果顺利得到winpooch.exe,把它和Language目录和FreeImage.dll弄到一起,就可以运行了。

 

抱歉!评论已关闭.