拿起cl.exe,放下IDE

时间:2023-03-09 15:18:06
拿起cl.exe,放下IDE

  笔者在这里介绍一种使用cl.exe编译源文件的方法,可以手动执行编译过程而不再依赖IDE,此外,笔者还介绍一些使用cl.exe编译简单源代码的方式。

  cl.exe是windows平台下的编译连接程序,其作用是将源代码编译并连接成对象文件(*.obj)并自动生成可执行文件(*.exe)。当然,cl.exe还有很多高级功能,在命令行中输入"cl.exe /?"可查看细节。

  笔者在win 7(x86)系统中安装的IDE为VS2010,采用默认的安装配置,安装后cl.exe的文件路径为:

  

C:\Program Files\Microsoft Visual Studio 10.0\VC\bin

  笔者在桌面用文本编辑器编辑了一个hello.c文件,其内容为输出"hello world!"。在CMD中切换工作目录至桌面,然后键入"cl.exe hello.c",运行时则得到错误。这是因为cl.exe的运行依赖很多的环境变量,如INCLUDE,LIB,PATH等,具体细节可参看文件:

C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat

  在vcvars32.bat是一个环境配置文件,其中配置了cl.exe运行的全部条件。(笔者注:当代码中涉及调用第三方库函数时,此时则应该修改环境配置文件)

  其实,安装VS2010后,开始栏中出现一个为“visual stdio 命令提示(2010)"的程序,观察其”属性”发现,该程序是在调用一个bat文件:

C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat

   该bat文件的作用其实是根据用户的平台来选择不同的环境配置文件。

  笔者使用“visual stdio 命令提示(2010)”程序,切换工作目录至桌面,然后键入"cl.exe hello.c",结果cl.exe成功执行,并生成了对象文件hello.obj和可执行文件hello.exe。

  笔者编辑了一个bat文件,文件名为MyComplier.bat,其内容为:

start C:\"Program Files"\"Microsoft Visual Studio 10.0"\VC\vcvarsall.bat x86

(笔者注:1,调用vcvarsall.bat时的参数“x86”是依赖于用户机器的,具体细节可参看vcvarsall.bat;2,在笔者的机器上,MyComplier.bat也可写成(根据绝对路径)调用vcvars32.bat)

  当MyComplier.bat和源代码在同一个目录下,则通过运行MyComplier.bat可以完成cl.exe的配置,然后自然就可以利用cl.exe来手动执行编译连接过程。至此,笔者实现了文本编辑器+MyComplier.bat的简易IDE。

  这样做的好处十分明显:如果仅仅是为了运行一个C/CPP文件,根本不用启动像vs2010这样重量级的IDE,省时省力。当然,这样做也有缺陷,无法DEBUG,而且面对大型的工程项目则显得不够用。但是,笔者认为,这篇文章的意义在于为读者提供了一种轻量级的IDE解决方案。只需要将MyComplier.bat文件和源代码放在同一个文件中,运行bat文件后即可顺利使用cl.exe,还有什么比这种方法更简洁?

  最后,笔者根据自己使用cl.exe的经验写出以下几点使用技巧,供读者参考。

  a,如果将上文中的文件hello.c重命名为"hello.txt",则使用命令“cl.exe hello.txt /TC”仍然可以编译成功。

  b,考虑这种情况,ZooAnimal.h文件中声明了类ZooAnimal的成员函数,ZooAnimal.cpp中则实现了这些成员函数,然后在第三个文件main.cpp中“#include "ZooAnimal.h"”来使用类ZooAnimal。当执行"cl.exe main.cpp"时则会提示错误。此时解决办法有两种,第一:修改main.cpp为“#include "ZooAnimal.cpp"”,第二种:先执行"cl.exe ZooAnimal.cpp",得到一个没有问题的"ZooAnimal.obj"和一个错误的"ZooAnimal.exe"(因为ZooAnimal.cpp中没有main函数)。然后再执行"cl.exe main.cpp /link ZooAnimal.obj"则编译成功(熟悉linux编译的读者对这种方法应该十分眼熟了)。

  c,(与b类似)fun.h中声明了一些函数,然后fun.c中实现了这些函数,第三个文件main.cpp中则通过“#include "fun.h"”来使用这些函数。参照b的两段式编译方法,此时仍然得到错误。这是因为,编译fun.c时,编译器则以c的风格来处理函数,当编译main.cpp时,编译器则采用c++风格来处理函数,此时编译器自然会提示“ error LNK2019: 无法解析的外部符号”,因此,在编译fun.c时应该使用cl的扩展选项"/TP“,执行"cl.exe fun.c /TP",然后再执行"cl.exe main.cpp /link fun.obj"就可以编译成功了。

  笔者将vs2010安装后对应的include文件,lib文件,bin中的exe文件等必备的文件拷贝出来,自己动手合成了一个可移动的C/C++编译平台,在一个虚拟的win7(无任何IDE)中成功编译了一个hello.c文件。当然,当源码使用到了一些高级编程方法(如mfc,windows应用程序)时,情况则会复杂一点,有兴趣的读者可以自己试一下。(笔者有用词不当或其它表述错误,敬请不吝指出!)