笔者在这里介绍一种使用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. ExtJS5_自定义菜单1

    顶部和底部区域已经作好,在顶部区域有一个菜单的按钮,这一节我们设计一个菜单的数据结构,使其可以展示出不同样式的菜单.由于准备搭建的是一个系统模块自定义的系统,因此菜单也是自定义的,在操作员系统登录的时 ...

  2. Regex sumologic

    https://www.sumologic.com/2014/08/18/no-magic-regular-expressions/

  3. android 多线程断点续传下载

    今天跟大家一起分享下Android开发中比较难的一个环节,可能很多人看到这个标题就会感觉头很大,的确如果没有良好的编码能力和逻辑思维,这块是很难搞明白的,前面2次总结中已经为大家分享过有关技术的一些基 ...

  4. x86 构架的 Arduino 开发板Intel Galileo

    RobotPeak是上海的一家硬件创业团队,团队致力于民用机器人平台系统.机器人操作系统(ROS)以及相关设备的设计研发,并尝试将日新月异的机器人技术融入人们的日常生活与娱乐当中.同时,RobotPe ...

  5. POJPower Network (最大流)

    题目链接. 分析: 这题描述的可不是一般的复杂. 其时就是很多源点.很多汇点,使尽量多流量的到达汇点. 因为有很多源点,就再设一个源点(0号),使得0号到其它源点的容量为其它源点的初始量,同样设一汇点 ...

  6. BZOJ 1027 [JSOI2007]合金

    1027: [JSOI2007]合金 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 2605  Solved: 692[Submit][Status][ ...

  7. 第一个Windows程序讲解

    上次,我们一起写了第一个Windows程序,虽然程序非常简单,但是它却可以帮助大家建立学好windows开发的信心. 今天,就让我帮助大家分析一下这个程序的内容.首先,我们的程序包含了一个头文件:wi ...

  8. Clone Graph——LeetCode

    Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...

  9. Android中bitmap的相关处理

    加载大图片 Options options=new Options(); options.inJustDecodeBounds=true;//不加载图片,只加载文件信息 //加载图片,获取到配置信息 ...

  10. UVAlive3523 Knights of the Round Table(bcc)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18122 [思路] 点-双连通分量 求出bcc,判断每个bcc是否为 ...