Windows命令行编译C++程序

/* 

 * 本文转自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,在其中写入如下代码:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2.   
  3. int main()  
  4. {  
  5.     std::cout<<"Hello World!"<<std::endl;  
  6.     while(1)  
  7.     {  
  8.         //ignore  
  9.     }  
  10. }  

保存之


第五步:编译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 分别是什么意义?


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值