原文出处:http://blog.csdn.net/chy555chy/article/details/52129501
##############################################################################
参考 http://blog.sina.com.cn/s/blog_7741c2f70101io0s.html
第一次用Markdown编辑器写博客,以前都是用Html编辑器写的。这次尝试一下Markdown,感觉效果不错,格式化代码的方式也很简洁。
由于在Linux上可以使用命令行,通过gcc命令编译C/C++程序。因此就想是否在windows上也可以通过命令行来编译C/C++程序。
网上有说,在windows下安装一个cygwin,然后就可以用gcc命令编译了,可是这样太麻烦了。然后我想VC6.0和Vistual Studio不是也可以编译C/C++文件的吗?虽然它们是图形化界面的方式,可是背后也一定是用命令行方式编译的。
当前环境 Win10 x64 & Vistual Studio 2015
首先,在桌面(我的目录是C:\Users\Administrator\Desktop\test.cpp)上新建一个文本文件,改名为test.cpp。test.cpp的内容如下:
#include
using namespace std;
int main()
{
cout<<"hello world!"<return 0;
}
我机子上安装的VS2015,vs2015的VC的bin目录下有个cl.exe就是负责编译C/C++程序的,位置如下:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
VC的include目录如下:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include
VC的lib目录如下:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib
直接在CMD下键入以下命令
set path=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
set include=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include
set lib=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib
这些设置仅在该CMD环境下有效,它并不会永久改变系统环境变量,只是临时改变而已。所以并不用太担心。
通过set命令可以查看当前配置的环境变量,如下:
进入test.cpp的目录,并运行 “cl test.cpp” 命令,报错:fatal error C: 无法打开包括文件: “corecrt.h”: No such file or directory
参考这篇博客http://blog.csdn.net/x356982611/article/details/51140807
进入C:\Program Files (x86)\Windows Kits\10\Include目录
我这里是找到其中最新版的点进去,进入到C:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\ucrt目录,corecrt.h文件如下:
修改环境变量,添加ucrt目录
set include=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include;C:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\ucrt
再次执行 “cl test.cpp” 命令,结果还是出错:LINK: fatal error LNK1104: 无法打开文件“uuid.lib”
参考这篇博客http://www.cnblogs.com/CHN-William/archive/2012/12/27/2835578.html,进入到C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib目录,果然发现Uuid.Lib
修改环境变量,添加该目录
set lib=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib
再次执行 “cl test.cpp” 命令,结果还是出错:LINK: fatal error LNK1104: 无法打开文件 “libucrt.lib”
进入C:\Program Files (x86)\Windows Kits\10\Lib目录
找最新版的文件夹,进入C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10586.0\ucrt\x64目录,发现“libucrt.lib”文件
这里说明一下,有d后缀的lib文件是Debug版本的,没有的是Release版本的,最明显的区别就是Release版的删除了Debug版本中诸如断点等调试信息,并且进行了代码优化,因此通常Release版本的都会比Debug版本的文件小。
修改环境变量,添加该目录
set lib=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10586.0\ucrt\x64
再次执行 “cl test.cpp” 命令,依然报错:libucrt.lib(exp21.obj) : fatal error LNK1112: 模块计算机类型“x64”与目标计算机类型“x86”冲突
但是扯淡的是为这里就是64位的Win10啊,当初是64位的Win7,用腾讯Win10装机助手升上去的。
修改环境变量,改为x86
set lib=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10586.0\ucrt\x86
执行成功,/out:test.exe test.obj
在输出目录下就生成了相应的 .obj 和 .exe 文件了。
执行test.exe,可以在CMD中看到相应的输出
经过这一次的反复百度,我得出一个经验:网上的博文大多都是Out,而且大家都是复制粘贴还写自己原创,所以一堆一样的资料,而且是不能运行的。所以以后看到网上的资料,一定要亲自试一下,并标注当时的环境才可信。
###########################################################
cl编译时出现的warning:warning c4530:使用了C++异常处理程序,但未启用展开语义
加入参数/EHsc,这样可以缩小捕获范围,从而是没必要的异常的消失。如:cl /EHsc hello.cpp就可以去除warining。