模拟Linux命令行方式在Windows下编译C/C++程序(使用VS编译器)

时间:2021-08-12 14:28:46

对于好奇心重的程序员来说非常想弄清楚一个程序从编辑到执行的过程中的种种细节,如编辑的C程序源代码,变成预编译程序是什么样子,预编译程序变成汇编代码是什么样子,汇编代码生成目标程序是什么样子,这过程中的不同格式的程序存储在内存中是什么样子,目标程序生成可执行程序过程中是如何实现链接等等,这些过程IDE环境都已经帮我们封装好了,不需要了解,也能编出好的程序,但本程序猿每次都不了解背后原理的瞎折腾,总觉得有些疙瘩窝在心里没有解决掉似的,还是多了解些背后原理,写程序都畅快些。

首先我们来做个最简单的实验:模拟Linux命令行方式在Window下编译C/C++程序(据说使用命令行编译程序能够好的理解程序背后的编译执行过程)。

1、编译源程序:用记事本编写程序代码,保存为test.c,文件路径为F:\\test.c。

模拟Linux命令行方式在Windows下编译C/C++程序(使用VS编译器)

2、设置环境变量:设置环境变量有两种方式,一种是直接在计算机高级系统设置里面设置环境变量,一种是通过批处理文件设置环境将量。

方法一:在计算机高级系统设置里面设置环境变量。

模拟Linux命令行方式在Windows下编译C/C++程序(使用VS编译器)

设置环境变量时需注意:设置好环境变量后再打开cmd命令行界面。(如果打开cmd命令行界面后再设置环境变量,编译程序时还是会找不到命令的)

除了要在Path变量里面加入bin文件夹外,还需要新建两个环境变量:

变量名: include     变量值为VC下的include文件夹路径。

变量名: lib     变量值:为VC下的lib文件夹路径。

方法二:批处理文件设置环境变量

用记事本写一段简单的批处理文件,内容如下所示,在保存文件时选择另存为,文件名假设为batch.bat,bat是批处理文件的后缀,假设其保存路径也是F:\\batch.bat。

set path=E:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin


set include=E:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include


set lib=E:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib

3、打开cmd命令行界面, 输入F:换到F盘, 最终定位到test.c所在文件夹, 使用cl编译器编译test.c程序,弹出系统错误。

注意:如果是使用批处理文件方式来设置环境变量,在键入cl test.c之前,需要先键入batch.bat,运行批处理文件, 批处理文件是在cmd命令下对环境变量进行修改的,在cmd命令行下的环境变量的修改只对当前窗口有效,不是永久性的修改。


bin目录下的cl.exe是Microsoft C/C++编译器。

关于打开cmd快捷键的方法:windows+R->弹出运行窗口,输入cmd即可。更简单的方法可以手动添加一个快捷键,从开始菜单 -> 附件 -> 找到“命令提示符”,右键->属性,其中有一项是“快捷键”,里面写的是“无”。可以发现这个输入框里的内容是无法编辑的,这不要紧,比如说你现在直接按下键盘上的C键,可以看到它自动设置了快捷键 “Ctrl + Alt + C”。点击确定。现在回到桌面上按下“Ctrl + Alt + C”,命令提示符窗口就会出来。

模拟Linux命令行方式在Windows下编译C/C++程序(使用VS编译器)

 问题:在VS10文件夹路径下的\VC\bin路径里没有找到mspdb100.dll,原来此文件在VC\Common7\IDE里,我们可以将此文件拷到bin文件夹里,或将……\VC\Common7\IDE加到批处理的path环境变量里,或者将其加到C文件所在的文件夹里,这只会引起在搜索顺序上的不同。(个人也不太明白是按怎样个搜索顺序机制来的,但是测试三种方案都是可以的)。

注意:如果把mspdb100.dll文件拷贝到bin文件夹下,再使用VS环境进行编译会出现“程序数据库管理器不匹配”的错误。

4、再次键入cl test.c,出现error  LNK1104:无法打开文件”kernel32.lib“,只生成了test.obj文件,没有生成test.exe文件。(obj是目标文件,针对的是一个程序对应的二进制文件,需要经过连接器链接器连接后才会生成可执行的二进制文件)

模拟Linux命令行方式在Windows下编译C/C++程序(使用VS编译器)

kernel32.lib是Windows系统文件,通过Windows自带的搜索工具,可以看到此文件在文件夹C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib里,我们可以将其加到test.c文件所在的文件夹或bin文件里。再次键入cl test.c,程序将被成功编译链接了,c文件所在的文件夹里多了两个文件:test.obj和test.exe.

注意:可能包含了iostream等头文件的cpp源文件,在编译时会出现一个warning:使用了C++异常处理程序,但未启用展开语义,指定/EHsc编译便可避免此类警告。

模拟Linux命令行方式在Windows下编译C/C++程序(使用VS编译器)

5、命令提示符界面键入test.exe,程序执行,输出了预期结果hello world!,至此,在Windows下模拟linux命令行操作,编译C/C++文件全部完成了。