/*
* 本文转自http://blog.csdn.net/hulin0229/article/details/22340397 感谢hulin0229的分享
* 参考 http://blog.renren.com/share/224338792/3343041028
* 参考《命令行编译 C++程序(Windows)》(文档见百度文库)
* 蓝色字为自己的学习&实践笔记 如有错误或不足之处 望大家批评指正
*/
命令行编译程序代码,因为编译效率高、不用去研究开发工具,可以使初学者集中精力在代码理解上,因此(命令行+文本编辑器【推荐EditPlus】)非常适合编程学习。但往往由于命令行没有像Visual Studio那么友好的UI界面,加上需要记忆一堆参数,因而让很多没有人指导的新手望而生畏。其实,如果有人稍微指点一下,大家会发现,命令行编译其实非常之简单。如果你是新手,想要学习这方面的东西,那么就看完下面的内容吧。
第一步:安装编译环境
下载并安装Visual Studio,本人安装的Visual Studio 2012
(实践环境:Visual Studio 2013 + Windows 8.1)
在Windows下用命令行编译C/C++有两种方法:
1. 使用Cygwin在Windows上模拟Linux环境,然后利用gcc/g++。
(使用Cygwin可参考 http://blog.csdn.net/jack_incredible/article/details/6982655)
2. 利用Visual Studio的 cl 编译器。(设置方法见以下文)
第二步:设置环境变量
注:环境变量分为两种:1. 用户的环境变量:只作用于当前用户; 2.系统变量:作用于系统上的所有用户
1. 设置用户的环境变量:
计算机-属性-高级-环境变量-用户变量:
a. 编辑PATH增加cl编译器的路径(以使在任何working directory里都能调用编译器):
C:\Program Files\Microsoft Visual Studio 12.0\VC\bin
*以及 MSPDB60.DLL的路径:
C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE,用分号分隔(此步没做)。
b. 新建变量INCLUDE(此环境变量告诉编译器必要的头文件在哪个目录下):
C:\Program Files\Microsoft Visual Studio 12.0\VC\include
c. 新建变量LIB(此环境变量告诉编译器必要的库文件在哪个目录下):
C:\Program Files\Microsoft Visual Studio 12.0\VC\lib
注:C:\Program Files\Microsoft Visual Studio 12.0是Visual Studio 2013的安装目录
2. 设置系统环境变量:
1)右键“计算机(我的电脑)”,选择“属性->高级系统设置->环境变量”,找到“系统变量”中的“PATH"属性,双击之
2)复制Visual Studio安装目录下的路径“D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin”到环境变量中(PATH中已经有其它变量,则粘贴到最后面,并且用英文“;”与前面的变量隔开)
新手指导:所谓环境变量,其实就是指操作系统执行命令时的默认检索路径。例如,假设有一个名为a.exe的可执行文件,存放于D盘的myApp目录中,不设置环境变量的情况下,你想从命令行启动a.exe,常规方法有两个:1、用DOS的cd命令进入到D:\myApp目录,然后输入a.exe回车;2、输入D:\myApp\a.exe然后回车。无论是方法1或者是方法2,要运行a.exe我们都需要先告诉系统a.exe在什么地方。我们不能直接在命令行输入a.exe然后回车来运行它,在不确定语境(路径)的情况下,系统不知道a.exe是什么东西,因为名为a.exe的文件可以在不同路径下存在若干个。操作系统不可能去搜索所有目录来弄明白a.exe的含义,一方面性能消耗太高,另一方面因为可能存在多个功能不同,仅仅名字相同的a.exe,因此它无法正确判断用户究竟想要执行哪个a.exe。直接输入a.exe然后回车,我们会看到一个错误提示——“a.exe不是内部或外部命令,也不是可运行的程序或批处理文件。”。如果每次执行a.exe都需要人为去告诉系统a.exe的含义(路径),无疑非常之麻烦,于是就有了系统环境变量这个东西来为我们简化操作。当我们将D:\myApp写到系统环境变量中去之后,再次在命令行中输入a.exe并回车时,操作系统就会自动去搜索环境变量路径下的名为a.exe的可执行程序来执行。以上就是系统环境变量的用途
理解:
每次打开Command Prompt的时候都会进入一个默认的路径,这个默认路径不一定是a.exe的路径。因此需要使用 cd 指令或者 cd.. 指令将路径调整为a.exe的路径,(或者按上述方法录入a.exe的完整路径运行之),调整的目的是为了告诉系统a.exe在什么地方。每次打开Command Prompt都要调整路径比较麻烦,为避免此麻烦,可将a.exe所在文件夹的路径添加到系统环境变量。添加后即使在打开Command Prompt后不调整路径,a.exe也能正确执行。
实践:
添加a.exe的路径到系统变量Path之后,打开Command Prompt后可直接运行a.exe
从Path中删除a.exe的路径之后,若在打开Command Prompt后直接运行a.exe则报错:
"a" is not recognized as an internal or external command, operable program or batch file.
注:若想更改默认的路径(亦称“预设路径”),
参见 http://www.foolegg.com/how-to-change-the-default-path-of-command-prompt-cmd/
步骤如下:
1. 单击[开始],搜索“regedit”并以管理员身份运行regedit,即打开了Registry Editor。
2. 左侧目录进入 HKEY_CURRENT_USER\Software\Microsoft\Command Processor,在右侧空白处单击右键,新建-字串值。
3. 将新建的字串值命名为AutoRun。
4. 右键单击AutoRun - 修改 - 更改[数值资料]为 CD /D C:\Users\Projects,其中C:\Users\Projects是a.exe所在文件夹的路径。
5. 重新打开Command Prompt,可见默认路径已改为 C:\Users\Projects。
再注:由于每次调试的程序文件不一定在一个路径下,故更改默认路径并不能一劳永逸,因此还是需要每次调整路径。
第三步:修改命令行启动参数
1)在“开始->运行”中输入“cmd”,开始菜单中将列出"cmd.exe",右键它,然后“发送到->发送到桌面快捷方式”
2)右键步骤1)中创建的桌面快捷方式,选择“属性->快捷方式”,找到“目标(T)”栏,修改目标为“C:\Windows\System32\cmd.exe /k vcvars32.bat”,修改好后点确定
新手指导:快捷方式的目标就是双击它时希望打开的程序的完整路径。如果足够细心,你应当会发现,上段文字中的目标路径后面有一串字符“/k vcvars32.bat”,它是用来告诉操作系统,在打开cmd.exe时,传什么参数给它。本文参数的意思是指,在运行cmd.exe后先执行批处理文件“vcvars32.bat”,然后等待用户继续输入。要了解一个可执行程序能接收什么参数和每种参数的意义,你可以用如下方法获取相关信息:在“开始->运行” 对话框中输入可执行程序的名字+ “ /?”。例如,我们要查询cmd.exe可接收什么参数,可以这样写:cmd.exe /? 回车(在命令行中执行程序也可用同样的方法查看程序参数)
疑问:欲查询a.exe可接收的参数,输入a.exe /? 回车,结果与运行a.exe并无差异,并没有显示对a.exe的参数的说明,为什么?
第四步:编写test.cpp程序
1)在D盘新建一个文件夹,命名为testCode
2)打开testCode,在里面新建一个文本文档,命名为test.cpp(注意,如果你的系统设置中隐藏了已知文件类型的扩展名,必须显示它,否则你创建的test.cpp的真实名字将是test.cpp.txt)
3)用记事本或EditPlus打开test.cpp,在其中写入如下代码:
- #include <iostream>
- int main()
- {
- std::cout<<"Hello World!"<<std::endl;
- while(1)
- {
- //ignore
- }
- }
保存之
第五步:编译test.cpp
1)双击第三步中创建的cmd.exe的桌面快捷方式,打开命令行窗口
2)输入:cd d: 回车
3)输入:cd Ccodes 回车
4)输入:cl -EHsc test.cpp 回车
编译器开始编译test.cpp。我们可以从命令行的输出内容中看到编译结果。如果程序没有书写错误,一定可以编译出一个test.exe和一个test.obj。其中exe文件即是编译后的可执行程序。obj文件是按块编译产生的中间文件。至此,整个命令行编译流程结束。要了解更详细的编译参数使用,可在命令行输入 cl /? 查看,或者找度娘咨询。
注意:
1)如果是你安装的是Visual Studio 2009之前的版本,则可以省略第三步,不用创建带运行参数的cmd.exe,设置完编译器的环境变量后直接在命令行窗口完成后续的编译即可。只有2009以后的版本,在命令行编译时才需要先执行“vcvars32.bat”。
2)Visual Studio 2012以前的命令行编译参数一般用cl -GX xxx.cpp,2012以后建议用cl -EHsc xxx.cpp
实践:
编译 cl a.cpp
出错 fatal error LNK1104: cannot open file 'uuid.lib'
在目录C:\Program Files(x86)\Microsoft SDKs\Windows\v7.1A\Lib里找到并拷贝到用户的环境变量中设定的Lib路径下
fatal error LNK1104: cannot open file 'kernel32.lib'
在目录C:\Program Files(x86)\Microsoft SDKs\Windows\v7.1A\Lib里找到并拷贝到用户的环境变量中设定的Lib路径下
再次编译 cl a.cpp
编译成功,生成 a.exe 和 a.obj 文件。
运行 a,运行成功。
疑问:-GX 和 -EHsc 分别是什么意义?