笔者在这里介绍一种使用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应用程序)时,情况则会复杂一点,有兴趣的读者可以自己试一下。(笔者有用词不当或其它表述错误,敬请不吝指出!)

拿起cl.exe,放下IDE的更多相关文章

  1. NMAKE:fatal error U1077.“\..\.cl.exe” return code 0xc0000135

    NMAKE:fatal error U1077.“cl.exe” return code 0xc0000135 产生原因:在安装visual studio的时候没有勾选注册环境变量导致的. 解决办法: ...

  2. ERROR CL .exe……错误

    这个错误遇见了两次,一次是在装VC时,解决办法见 这个 还有一次是VS2012时,遇见了: error MSB6006: “CL.exe”已退出,代码为 -1073741515. 解决办法:Add t ...

  3. 通过命令行使用cl.exe编译器

    转载http://www.cnblogs.com/mizhongqin/archive/2013/03/11/cmd_cl-exe_vs2010.html 与在IDE中编译相比,命令行模式编译速度更快 ...

  4. 链接器link.exe 编译器cl.exe 资源编译器rc.exe

    原文地址:https://blog.csdn.net/biggbang/article/details/24433065 1.cl.exe文件是Visual C\C++的编译器,它将程序源代码文件编译 ...

  5. cl.exe 命令行编译sqlite3 sqlite3.dll及sqlite3.exe

    有点被宇宙最强的ide惯坏了,封装的太好,不能像gcc那样一步步了解其原理,其实强大的vs背后也有类似gcc的cl.exe 看到How To Compile SQLite http://sqlite. ...

  6. [原创]在Windows平台使用msvc(cl.exe) + vscode编写和调试C/C++代码

    1.在.vscode目录下,新建以下几个配置文件,当然也可以通过vscode命令自动生成,如果你已有这些文件直接修改即可. c_cpp_properties.json(代码提示): { "c ...

  7. 调用Visual Studio的cl.exe编译C/C++程序

    @ 目录 调用Visual Studio的cl.exe编译C/C++程序 前言 1.查看VS的路径 2.添加环境变量 3.查看设置是否生效 4.配置Notepad++ 调用Visual Studio的 ...

  8. react-native执行 npm install cl.exe找不到 的问题

    最近在学习react-native,昨天在尝试某个demo时,执行 npm instal, 总是遇到 cl.exe文件找不到,最开始以为Microsoft Visual C++ 2015 Redist ...

  9. error MSB6006: “CL.exe”已退出,代码为X —— 的解决办法

    错误 : error MSB6006: “CL.exe”已退出,代码为X . 解决方法: 1.有少可能是执行目录引起的. 参考 http://bbs.csdn.net/topics/370064083 ...

随机推荐

  1. c# 接口代码实例

    类和接口的实现 接口定义:为一组方法签名指定一个名称的方式. 类实现接口,就一定要提供接口所有方法的实现. 即使抽象类,也要全部实现,但是,它可以把接口方法声明为abstract的,从而把这个接口方法 ...

  2. 汇编-显示我放到AL中的数值

    按书上练习,有一些我看不懂. . .model flat,stdcall option casemap:none include \masmplus\include\windows.inc inclu ...

  3. 自定义xamarin.forms Entry 背景色以及边框

    创建   一个Xamarin.Forms自定义控件.     自定义Entry控件可以通过继承来创建Entry控制,显示在下面的代码示例: public class MyEntry : Entry { ...

  4. Signing key has not been configured

    Signing key has not been configured.https://dev.openwrt.org/changeset/38284 Add package signing key ...

  5. HDU 1254 推箱子 BFS

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目分析: 做这道题,感觉挺简单的,做着做着就错了20次, 我也是醉了, WA到吐的节奏啊! 思 ...

  6. CSS3学习笔记(新属性)

    1. 边框(圆角边框.加阴影和用图片绘制) 新增加 border-radius  box-shadow  border-image .div1{ border:2px solid purple; bo ...

  7. input type=file accept中可以限制的文件类型

    在上传文件的时候,需要限制指定的文件类型. <input type="file" accept="image/*" /> accept表示可以上传文 ...

  8. 使用FTPClient进行文件服务器内文件的上传和下载

    我用的FTPClient是由Apache组织的commons-net.jar包中的API,这个包用起来非常的方便,很容易上手.我在项目开发的过程中主要用到了文件的上传和下载功能,下面将我开发的代码贴出 ...

  9. RMAN-00554: initialization of internal recovery manager package failed RMAN-04005

    [oracle@rac11g1 ~]$ rman target haha/haha@rac11g Recovery Manager: Release 11.2.0.3.0 - Production o ...

  10. VS2008LINK : fatal error LNK1000: Internal error during IncrBuildImage

    修改链接选项,方法:项目->属性->链接器->常规   下面的“启用增量链接”,将“是(/INCREMENTAL)”改为“否(/INCREMENTAL:NO)”,然后确定就可以了.