以前写程序,都是在VS环境下完成,一点BUILD,一切OK。但是,最近工作中要写的程序,环境要求就有点乱了。比如ITK,它用的是VC的编译程序来编译,但又没有提供VC的工程生成向导,配置起来很麻烦。最麻烦的是,ITK还往往要和RC程序配合使用,而ITK使用C++开发,RC插件使用JAVA开发。
于是,我不得不手动配置JAVA的主要开发工具ECLIPSE,让基于VC编译器编译的C++程序,也能在ECLIPSE上跑起来。这样,我就可以把ITK和RC插件代码都放在同一个编辑器中编辑了。
可让我想不到的麻烦来了。
ECLIPSE的C++开发插件,最主要的,可能就是CDT,没二话,装!
CDT主要是为GUN C/C++工具做的,为了使用VC的编译器,一句话,改!
按照CSDN论坛所说,修改了一些配置,终于让CDT驱使着VC编译器跑起来了。
但是,我用CDT的目的,不是为了自找麻烦,而是为了更加方便快捷,因此,针对ITK程序的特点,我必须要进行必要的修改。INCLUDE,LIB之类的,就不说了,编译链接参数,也可以在ITK自带的BAT编译脚本能找到。
可是,编译的使用,用make还是nmake来控制编译过程?这是个问题。
CSDN论坛上推荐的是使用GNU make,而我最初使用nmake来控制编译。之前我并非没有接触过make和makefile,只是平时用得少,没什么深入了解。这次不行了,必须要研究研究。
使用nmake,给我最大的感觉,就是资料很少,功能很弱。我在网上几乎没找到什么资料,或者,准确说,我只找到两份资料,一份是罗云彬先生在《WIN32汇编程序设计》中的一段文章,因为人家主要是讲汇编,而不是讲makefile,所以内容并不详细;另一份是某网页上综合微软关于make的说明和自己的经验写的文章,还算比较详细,至少比罗云彬先生那段文章详细且更准确。但是,我愣是没找到我要的一个东西:针对当前目录下所有CPP文件,得到一个OBJ文件列表。这当然也和我看资料比较粗糙,学识比较浅薄有关。可是,在GNU make手册上,却直接给出了这种最常用的手法的makefile代码。得,转用GNU make吧。不说别的,至少它有很全的使用手册。
我先到CSDN上DOWN了一个make,放进PATH中,改该makefile文件,OK一切正常。
因为ITK通常会生成四种文件类型,也就意味着编译时,它有四种参数配置。于是,我试图在makefile中使用目标指向变量(即局部变量),结果报错。反复阅读makefile代码,又反复对照参考手册,我百思不得其解。咋回事?貌似我没写错啊。于是我又去网上搜索,无意中发现一哥们提到这样一种情况:GNU make 3.79版有bug,他在无法通过编译的情况下,换用了GNU make 3.81,结果一切正常。
我看了下我手头的make.exe文件,修改日期:1998年。晕了,莫非是版本太老了,不支持目标指向变量?我跑GNU官方,到FTP服务器,make下面看了下,它最低版本是3.75,使用make -v一查,我手头的版本正是3.75。3.75版本的GNU make不支持目标指向对象吗?我在网上没找到答案。
懒得自己编译,直接去下了个MinGW的make 3.81 for windows,晕死,居然有三个文件?我最烦这个了,拖泥带水的。不过为了测试,我忍了!下载下来,加入PATH路径,make了一下,目标指向变量一行,顺利通过,一切正常。看来,真有很大可能是3.75版本不支持目标指向对象。
还是无法忍受一个make带有三个文件(一个可执行文件,两个库文件),于是,我打算自己下源代码来编译。就下最新版本,3.82吧。
下下来后,解压,文件中有个build_win32.bat,想都不想,设置好VS路径,立马运行它!结果:编译错误……
扯了,这还会出错?到网上一搜,有哥们说,直接运行build_win32.bat,直接得到.exe文件。我欲哭无泪,咋这哥们就这么顺呢?我咋就这么背?我挨个试里面可执行文件,最好的状态,是说找不到config.h或者链接时找不到外部符号,最糟糕的状态,直接死机……
我无语了。还是看看README吧。根据README所说,我又找到INSTALL,看了半天,全是废话(我用不到的,都是废话),没发现有介绍在WINDOWS下怎么编译的。不行了……
突然,我发现文件夹下还有个VS 2003的工程文件……郁闷了,莫非要装个VS 2003来编译?一咬牙,装就装吧。
弄了半天,VS 2003装好了,打开工程文件,一点编译,靠,居然还有文件COPY操作!COPY的文件,正是我前面编译找不到的什么config.h……(这是什么东西,我至今还没弄清楚)
一堆的警告,零个错误,make.exe终于出炉了……
放入虚拟机的ECLIPSE下去编译,OK,终于搞定了……
至此,连同研究makefile文件格式,用去了三天……