笔者在这里介绍一种使用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. 转:Centos6.3添加解码器播放MP3和常见视频音频

    原文来自于:http://blog.csdn.net/odaynot/article/details/8462273 参考地址: http://wiki.centos.org/AdditionalRe ...

  2. Open vSwitch源码阅读【转】及自己的理解【稍后更新】

    http://blog.chinaunix.net/uid-24485075-id-2240075.html

  3. Visual Studio如何删除多余的空行

    原文:Visual Studio如何删除多余的空行 如何在Visual  Studio中删除多余的空格: 适用于:Visual Studio2008 &2010 1.       Ctrl + ...

  4. 自定义AuthorizeAttribute

    原文地址:http://www.cnblogs.com/shanyou/archive/2010/03/29/1699511.html 网站的权限判断是一个非常普遍的需求,从文章ASP.NET MVC ...

  5. [Design Pattern] Iterator Pattern 简单案例

    Iterator Pattern,即迭代时模式,按照顺序依次遍历集合内的每一个元素,而不用了解集合的底层实现,属于行为类的设计模式.为了方便理解记忆,我也会称其为遍历模式. 下面是一个迭代器模式的简单 ...

  6. TestNG 与 Junit的比较(转)

    转自 http://www.blogjava.net/fanscial/archive/2005/12/14/23780.html 1.         JDK 5 Annotations (JDK ...

  7. redis在Java web项目的简单应用(转载)

    看到一篇关于redis和spring集成的文章,实际测试后,可以.转载以备用.谢谢 亲昵YY! html,body { font-size: 15px } body { font-family: He ...

  8. Unity3D基础学习 NGUI之Example 13 - Tabs简要概述

    首先建一个2D相机,在Anchor下新建一个子物体,添加WindowDrag Tilt脚本,用作拖动窗口 然后新建一个Panel,包含两个content,两个Tab,设置两个Content用来显示切换 ...

  9. 705 - Slash Maze

    By filling a rectangle with slashes (/) and backslashes ( ), you can generate nice little mazes. Her ...

  10. LVS+Keepalived实现MySQL从库读操作负载均衡

    http://www.osyunwei.com/archives/7464.html (学习运维知识好站) 说明: 操作系统:CentOS 5.X 64位 MySQL主服务器:192.168.21.1 ...