windows利用DOS窗口编译C++文件

原文出处: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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

我机子上安装的VS2015,vs2015的VC的bin目录下有个cl.exe就是负责编译C/C++程序的,位置如下:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
  • 1

VC的include目录如下:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include
  • 1

VC的lib目录如下:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib
  • 1

直接在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
  • 1
  • 2
  • 3

      这些设置仅在该CMD环境下有效,它并不会永久改变系统环境变量,只是临时改变而已。所以并不用太担心。

通过set命令可以查看当前配置的环境变量,如下: 
set命令结果

进入test.cpp的目录,并运行 “cl test.cpp” 命令,报错:fatal error C: 无法打开包括文件: “corecrt.h”: No such file or directory 
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

我这里是找到其中最新版的点进去,进入到C:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\ucrt目录,corecrt.h文件如下: 
C:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\ucrt

修改环境变量,添加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
  • 1

再次执行 “cl test.cpp” 命令,结果还是出错:LINK: fatal error LNK1104: 无法打开文件“uuid.lib” 
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 
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib

修改环境变量,添加该目录

set lib=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib
  • 1

再次执行 “cl test.cpp” 命令,结果还是出错:LINK: fatal error LNK1104: 无法打开文件 “libucrt.lib” 
LINK: fatal error LNK1104: 无法打开文件 “libucrt.lib”

进入C:\Program Files (x86)\Windows Kits\10\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”文件 
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10586.0\ucrt\x64 
这里说明一下,有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
  • 1

再次执行 “cl test.cpp” 命令,依然报错:libucrt.lib(exp21.obj) : fatal error LNK1112: 模块计算机类型“x64”与目标计算机类型“x86”冲突 
libucrt.lib(exp21.obj) : fatal error LNK1112: 模块计算机类型“x64”与目标计算机类型“x86”冲突
但是扯淡的是为这里就是64位的Win10啊,当初是64位的Win7,用腾讯Win10装机助手升上去的。 
Windows 10 专业版

修改环境变量,改为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
  • 1

执行成功,/out:test.exe test.obj 
/out:test.exe test.obj
在输出目录下就生成了相应的 .obj 和 .exe 文件了。 
输出目录下就生成的 *.obj 和 *.exe 文件 
执行test.exe,可以在CMD中看到相应的输出 
执行test.exe

经过这一次的反复百度,我得出一个经验:网上的博文大多都是Out,而且大家都是复制粘贴还写自己原创,所以一堆一样的资料,而且是不能运行的。所以以后看到网上的资料,一定要亲自试一下,并标注当时的环境才可信。

###########################################################

cl编译时出现的warning:warning c4530:使用了C++异常处理程序,但未启用展开语义
加入参数/EHsc,这样可以缩小捕获范围,从而是没必要的异常的消失。如:cl /EHsc hello.cpp就可以去除warining。

你可能感兴趣的:(C++)