剖析VC编译器及nmake.doc
文本预览下载声明
剖析VC编译器及nmake
Longlongago sunxuechen
第一节 当你看透了它华丽的外壳,你就真正拥有了它!
MyEclipse是开发java应用程序的一个非常好用的IDE,如同VC是c++的友好开发环境一样,最近看了一下java中ant,感觉以前都没有想过编译的顺序需要自己指定。
以前使用vc的话也只是有系统提供默认的编译顺序,有的时候真的不愿意去揭穿它背后的秘密,因为我怕接受不了华丽外壳后晦涩的本质。
由于一开始学习c++时候就是使用VC的IDE,导致只是学习到了c++的语法,对构建大型c++应用程序只是靠VC提供的编译环境,而丝毫没有想到中间的透明化处理,所以本质上来说,确实是学习了VC而不是学习了c++。
下面就从MakeFile谈起,来慢慢的深入了解一下真正的c++。
有用的路径:
E:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin
其中包括了一些动态链接库,有很多时候都需要被加载。
VC安装后的目录结构图
Common文件夹下应该是存放的Microsoft Visual Studio 公共资源,包括VB等均可使用。
VC98 文件夹下应该就是对应VC IDE 的一些资源。
下面我们要动手脚的地方就是VC98下的Bin目录,其中有一个很好的东西,就是cl.exe
平时我们运行VC时候经常出现cl.exe,这无疑是晴天霹雳,因为一般这种问题在新手看来都是很棘手的,就算是你接触VC有一段时间,也很难说你知道它的具体原因。
cl.exe : compile-link executor ,我的理解是这样的。
然后我们就近距离接触一下cl.exe
首先,准备一份见面礼,如下
#includestdio.h
void main()
{
printf(Hello CL !);
} 然后,将其拷贝到目录 E:\Program Files\Microsoft Visual Studio\VC98\Bin下,因为这样比较方便,有很多dll文件都在其下,而且最关键的是,它有一个环境变量注册文件:VCVARS32.BAT。
进入cmd,然后进入E:\Program Files\Microsoft Visual Studio\VC98\Bin,然后执行VCVARS32.bat,这样就注册好了编译器cl所要使用的环境变量,之后输入
这样,编译结束,你会得到一个test.obj和test.exe文件,然后你可以执行这个test.exe文件。
就算现在这样,我还是感觉受益匪浅,好像以前曾经尝试过使用cl,但是还是没有付诸实施,今天终于得见庐山真面目,还是感慨万千啊。
第二节 当你认为你拥有了它,其实你远远没有。
物以类聚,我们既然知道了有个cl,必然要知道有什么和它放在一起,他们又有什么作用,那么就让我们来看看E:\Program Files\Microsoft Visual Studio\VC98\Bin下还有什么好东东吧~
我们只关注可执行文件,如下
看看吧,1998年,是不是相见很晚啊!
然后,我们看到有个DUMPBIN,这个是经常用来查看二进制文件的,比如DLL,他可以告诉你DLL中有哪些函数,功能和TOOLs中的DEPENDS差不多。
另外,还有一个Editbin,看起来向修改二进制数据的,但是我还没试验成功~有错误~
还有就是link,这个一看就知道是连接用的,你可以直接使用link test.obj去产生test.exe,我试过了,绝对没错。
既然这样,就一定有个compile把,因为cl是compile和link的缩写嘛,而且一般的步骤都是这样的,首先是编译然后连接,到底是哪个文件呢,我确实没找到~
不得不引用一篇网上一篇很有思想的文章:
首先简单介绍一下程序是如何编译链接的。程序写好之后,我们进行编译和链接来产生可执行程序。这时候,编译器为了完成编译和链接,需要知道很多信息。比如要编译的文件是哪一个,使用哪些编译选项进行编译,编译好之后输出到哪里,输出文件叫什么名字等等。makefile 就是被vc使用保存这些信息的方法之一,编译时程序nmake根据makefile中的信息,在用相应选项执行编译,用相应执行链接,最后生成可执行文件。vc的编译程序是CL.EXE,链接程序是LINK.EXE。关于本文所提到的vc编译链接用的程序都在 目录 ...Microsoft Visual StudioVC98Bin 下。
整个过程如下。
在我看这个console程序的makefile的时候,突然怀疑vc6中,console,sdk,mfc等的编译也是通过执行外部的 nmake.exe来完成的。如果真是
显示全部