拿起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应用程序)时,情况则会复杂一点,有兴趣的读者可以自己试一下。(笔者有用词不当或其它表述错误,敬请不吝指出!)
拿起cl.exe,放下IDE的更多相关文章
- NMAKE:fatal error U1077.“\..\.cl.exe” return code 0xc0000135
NMAKE:fatal error U1077.“cl.exe” return code 0xc0000135 产生原因:在安装visual studio的时候没有勾选注册环境变量导致的. 解决办法: ...
- ERROR CL .exe……错误
这个错误遇见了两次,一次是在装VC时,解决办法见 这个 还有一次是VS2012时,遇见了: error MSB6006: “CL.exe”已退出,代码为 -1073741515. 解决办法:Add t ...
- 通过命令行使用cl.exe编译器
转载http://www.cnblogs.com/mizhongqin/archive/2013/03/11/cmd_cl-exe_vs2010.html 与在IDE中编译相比,命令行模式编译速度更快 ...
- 链接器link.exe 编译器cl.exe 资源编译器rc.exe
原文地址:https://blog.csdn.net/biggbang/article/details/24433065 1.cl.exe文件是Visual C\C++的编译器,它将程序源代码文件编译 ...
- cl.exe 命令行编译sqlite3 sqlite3.dll及sqlite3.exe
有点被宇宙最强的ide惯坏了,封装的太好,不能像gcc那样一步步了解其原理,其实强大的vs背后也有类似gcc的cl.exe 看到How To Compile SQLite http://sqlite. ...
- [原创]在Windows平台使用msvc(cl.exe) + vscode编写和调试C/C++代码
1.在.vscode目录下,新建以下几个配置文件,当然也可以通过vscode命令自动生成,如果你已有这些文件直接修改即可. c_cpp_properties.json(代码提示): { "c ...
- 调用Visual Studio的cl.exe编译C/C++程序
@ 目录 调用Visual Studio的cl.exe编译C/C++程序 前言 1.查看VS的路径 2.添加环境变量 3.查看设置是否生效 4.配置Notepad++ 调用Visual Studio的 ...
- react-native执行 npm install cl.exe找不到 的问题
最近在学习react-native,昨天在尝试某个demo时,执行 npm instal, 总是遇到 cl.exe文件找不到,最开始以为Microsoft Visual C++ 2015 Redist ...
- error MSB6006: “CL.exe”已退出,代码为X —— 的解决办法
错误 : error MSB6006: “CL.exe”已退出,代码为X . 解决方法: 1.有少可能是执行目录引起的. 参考 http://bbs.csdn.net/topics/370064083 ...
随机推荐
- 11 - 改变vtkImageData中的Manipulation 方法 VTK 6.0 迁移
VTK6 引入了许多不兼容的变.这其中就包括关于vtkImageData中元数据管理及内存分配的方法.这些方法有些直接改变了行为或者能加了额外的参数. GetScalarTypeMin() GetSc ...
- CentOS 6.4 64位 源码编译hadoop 2.2.0
搭建环境:Centos 6.4 64bit 1.安装JDK 参考这里2.安装mavenmaven官方下载地址,可以选择源码编码安装,这里就直接下载编译好的wget http://mirror.bit. ...
- BeanUtils API中使用ConvertUtils向BeanUtils注册一个日期转换器
ConvertUtils.register(new Converter(){ public Object convert(Class type, Object value){ if(value == ...
- Xamarin.Forms WebView
目前本地或网络的网页内容和文件加载 WebView是在您的应用程序显示Web和HTML内容的视图.不像OpenUri,这需要用户在Web浏览器的设备上,WebView中显示您的应用程序内的HTML内容 ...
- 快速生成apk 自动发布到网站 便于测试
遇到的问题: 开发者生成的apk 需要不断给 测试安装让他们测试.有没有脚本自动将最新apk上传到服务器,让测试自己安装测试呢?mac电脑 怎么自己搭建文件服务器 启动Tomcat功能在这里不在赘述 ...
- 下载cppunit
cppunit的官方地址:http://sourceforge.net/projects/cppunit 方式一:下载打包好的版本 下载地址:http://sourceforge.net/projec ...
- Selenium IDE整理
安装 Step1: 下载Firefox浏览器 http://www.firefox.com.cn/ Step2: 安装Selenium IDE插件 http://seleniumhq.org/down ...
- GMU
NEXT | 不错过任何一个新产品 百度开源 Mobile UI 组件库,提供 Web app.Pad 端简单易用的 UI 组件 发表评论
- LeetCode Maximum Product Subarray 解题报告
LeetCode 新题又更新了.求:最大子数组乘积. https://oj.leetcode.com/problems/maximum-product-subarray/ 题目分析:求一个数组,连续子 ...
- [ES6] Object.assign (with defaults value object)
function spinner(target, options = {}){ let defaults = { message: "Please wait", spinningS ...