此文档集合了三篇文章的内容,分别是:
http://www.xue5.com/Developer/C++/665229.html
http://blog.csdn.net/daisy19900111/article/details/8035131
http://blog.csdn.net/livelylittlefish/article/details/6093903
一、
(2)用记事本写一段简单的批处理文件,内容如下所示,在保存文件时选择另存为,文件名假设为batch.bat,bat是批处理文件的后缀,保存类型选择:所有文件(这个尤其需要注意),假设其保存路径也是C:\Users\Administrator\Desktop。
setpath=D:\Softwares\en_Visual_Studio2010_Professional_x86_x16-81637\VC\bin
setinclude=D:\Softwares\en_Visual_Studio2010_Professional_x86_x16-81637\VC\include
setlib=D:\Softwares\en_Visual_Studio2010_Professional_x86_x16-81637\VC\lib
上面批处理文件的第一句话表示设置环境变量,这个也可以通过:计算机/属性/高级系统设置/环境变量/用户变量,D:\Softwares\en_Visual_Studio2010_Professional_x86_x16-81637\VC\bin放到path的值里去,记得与之前已有值之间用";"隔开。这个path文件夹是我们装载VS2010时自带的,在设置路径时要根据自己的安装路径进行修改,里面包含微软在Windows下给我们提供的C/C++编译器cl.exe程序(编译器自身也是一个软件程序,只是它的作用是用来编译其它的程序),当然还有link.exe链接程序,调用cl时,系统会自动调用link程序(后面将看到我们只用了cl命令就可以进行C/C++程序的编译、链接)。后面两句话分别表示包含C++中自带的头文件库和静态链接库,静态理解库包含了头文件中函数对应的实现部分,为了不让人们看到其中的源代码,它以二进制文件形式编码,若要查看其内容需要进行反汇编。
(3)通过cmd命令进入DOS操作界面,输入cd C:\Users\Administrator\Desktop进入cpp文件和bat批处理文件所在的位置,然后键入batch.bat进行批处理,这些操作在VS2010集成开发环境中都为我设置好了,所以我们在里面写C/C++程序时并没有这样设置路径的繁琐操作,但是通过自己手动的路径设置,我们会对程序的编译、链接、执行有更加深入的认识。
(4)键入cl hello.cpp,我们会看到计算机报出了“无法启动此程序,因为计算机中丢失mspdb100.dll。尝试重新安装该程序以解决此问题”的系统储物,dll文件是动态链接库文件,其是在cl.exe程序运行时才被加载进来的文件,这个静态链接库lib文件不同。这说明在D:\Softwares\en_Visual_Studio2010_Professional_x86_x16-81637\VC\bin路径里没有找到mspdb100.dll,原来此文件在文件夹D:\Softwares\en_Visual_Studio2010_Professional_x86_x16-81637\VC\Common7\IDE里,我们可以将此文件拷到bin文件夹里,或将D:\Softwares\en_Visual_Studio2010_Professional_x86_x16-81637\Common7\IDE加到批处理的path环境变量里,或者将其加到cpp文件所在的文件夹里,这只会引起在搜索顺序上的不同。
(5)再次键入cl hello.cpp,我们看到在C:\Users\Administrator\Desktop文件夹里得到了hello.obj文件,这是编译后的输出文件,但是没有得到可执行exe文件,DOS界面里出现这样的错误“LINK:fatalerror LNK1104:cannot open file 'kernel32.lib' “这样的链接错误,kernel32.lib是Windows系统文件,通过Windows自带的搜索工具,我们看到此文件在文件夹C:\ProgramFiles\Microsoft SDKs\Windows\v7.0A\Lib里,我们可以将其加到cpp文件所在的文件夹或bin文件里。再次键入cl hello.cpp,我们发现这次程序被成功编译链接了,cpp文件所在的文件夹里多了两个文件:hello.obj和hello.exe。
(6)在DOS界面键入hello.exe,程序被执行,输出了我们预想的helloworld!,至此,在Windows下模拟linux命令行操作,编译C/C++文件全部完成了。
二、
如何配置才能使用 cl命令编译C/C++ 程序?
在 VS 环境中,我们可以顺利的编译、生成程序。究其原因,是因为 VS 的 IDE 本身已经配置好了编译程序所需的 executable file , include files 和 library 的路径。以 VS2005 为例,在其 IDE 环境中,通过 tools->options->Projects and Solutions->VC++Directories ,即可查看已经配置好的 Executable files , Include files 和 Library files 。
我们知道, VS 也提供了命令行,那么,该如何配置,才能通过命令行编译、生成程序?
本文以 VS2005 为例,操作系统为 windows XP ,且笔者的机器中安装了 ACE , Boost , cppunit 等软件或库。 VS 及这些软件或库的安装目录如下。
D:/Program Files/Microsoft Visual Studio 8
E:/opensource/ACE-5.6.4/ACE_wrappers
E:/opensource/boost_1_40_0
E:/opensource/cppunit-1.12.1
1. 方法 1 :手动配置
下文的操作都是通过直接通过“系统 -> 属性 -> 高级 -> 环境变量”来添加或修改的,以便于立即生效。
(1) 添加公共变量
VSInstallDir=D:/Program Files/Microsoft Visual Studio 8
VCInstallDir=D:/Program Files/Microsoft Visual Studio8/VC
FrameworkDir=C:/WINDOWS/Microsoft.NET/Framework
FrameworkVersion=v2.0.50727
(2) 修改 path 变量
在用户 path 变量后面添加如下路径:
%VCInstallDir%/BIN;
%VCInstallDir%/PlatformSDK/bin;
%VSInstallDir%/Common7/IDE;
%VSInstallDir%/Common7/Tools;
%VSInstallDir%/Common7/Tools/bin;
%VSInstallDir%/SDK/v2.0/bin;
%FrameworkDir%/%FrameworkVersion%;
%VCInstallDir%/VCPackages;
(3) 添加 INCLUDE 变量
%VCInstallDir%/ATLMFC/INCLUDE;
%VCInstallDir%/INCLUDE;
%VCInstallDir%/PlatformSDK/include;
%VSInstallDir%/SDK/v2.0/include;
%ACE_ROOT%;
%BOOST_1_40_ROOT%;
%CPPUNIT_ROOT%/include ;
(4) 添加 LIB 变量
%VCInstallDir%/ATLMFC/LIB;
%VCInstallDir%/LIB;
%VCInstallDir%/PlatformSDK/lib;
%VSInstallDir%/SDK/v2.0/lib;
%ACE_ROOT%/lib;
%BOOST_1_40_ROOT%/stage/lib;
%CPPUNIT_ROOT%/lib ;
其中,
ACE_ROOT=E:/opensource/ACE-5.6.4/ACE_wrappers
BOOST_1_40_ROOT=E:/opensource/boost_1_40_0
CPPUNIT_ROOT=E:/opensource/cppunit-1.12.1
当然,这几个变量是已经配置好的。
2. 方法2:自动配置
如果想省事,我们可以修改并执行以下 bat 文件,该文件会完成 VS2005 的环境变量的设置。
D:/Program Files/Microsoft Visual Studio 8/Common7/Tools/vsvars32.bat
文件修改前的内容如下,
@SET VSINSTALLDIR =D:/Program Files/Microsoft Visual Studio8
@SET VCINSTALLDIR =D:/Program Files/Microsoft Visual Studio8/VC
@SET FrameworkDir =C:/WINDOWS/Microsoft.NET/Framework
@SET FrameworkVersion =v2.0.50727
@SET FrameworkSDKDir =D:/Program Files/Microsoft Visual Studio8/SDK/v2.0
@if "%VSINSTALLDIR%"=="" gotoerror_no_VSINSTALLDIR
@if "%VCINSTALLDIR%"=="" gotoerror_no_VCINSTALLDIR
@echo Setting environment for using Microsoft VisualStudio 2005 x86 tools.
@rem
@rem Root of Visual Studio IDE installed files.
@rem
@set DevEnvDir=D:/Program Files/Microsoft Visual Studio8/Common7/IDE
@set PATH =D:/Program Files/Microsoft Visual Studio8/Common7/IDE;D:/Program Files/Microsoft Visual Studio 8/VC/BIN;D:/ProgramFiles/Microsoft Visual Studio 8/Common7/Tools;D:/Program Files/Microsoft VisualStudio 8/Common7/Tools/bin;D:/Program Files/Microsoft Visual Studio8/VC/PlatformSDK/bin;D:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/bin;C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727;D:/ProgramFiles/Microsoft Visual Studio 8/VC/VCPackages;%PATH%
@set INCLUDE =D:/Program Files/Microsoft Visual Studio8/VC/ATLMFC/INCLUDE;D:/Program Files/Microsoft Visual Studio8/VC/INCLUDE;D:/Program Files/Microsoft Visual Studio8/VC/PlatformSDK/include;D:/Program Files/Microsoft Visual Studio8/SDK/v2.0/include;%INCLUDE%
@set LIB =D:/Program Files/Microsoft Visual Studio8/VC/ATLMFC/LIB;D:/Program Files/Microsoft Visual Studio 8/VC/LIB;D:/ProgramFiles/Microsoft Visual Studio 8/VC/PlatformSDK/lib;D:/Program Files/MicrosoftVisual Studio 8/SDK/v2.0/lib;%LIB%
@set LIBPATH=C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727;D:/Program Files/MicrosoftVisual Studio 8/VC/ATLMFC/LIB
@goto end
:error_no_VSINSTALLDIR
@echo ERROR: VSINSTALLDIR variable is not set.
@goto end
:error_no_VCINSTALLDIR
@echo ERROR: VCINSTALLDIR variable is not set.
@goto end
:end
如果不修改该文件,运行完 vsvars32.bat 文件,只能通过命令行编译、生成一般的 C/C++ 程序;所以,如果程序是基于诸如 ACE 、 Boost 等库的程序,则编译、生成仍然会失败,因为 vsvars32.bat 文件只是设置了一些一般的 C/C++ 程序所需要的头文件和库目录。因此,为了能够编译 ACE 、 Boost 和 CppUnit 的程序,需要修改 vsvar32.bat 文件,修改如下
@SET VSINSTALLDIR =D:/Program Files/Microsoft Visual Studio8
@SET VCINSTALLDIR =D:/Program Files/Microsoft Visual Studio8/VC
@SET FrameworkDir =C:/WINDOWS/Microsoft.NET/Framework
@SET FrameworkVersion =v2.0.50727
@SET FrameworkSDKDir =D:/Program Files/Microsoft Visual Studio8/SDK/v2.0
@SET ACE_ROOT=E:/opensource/ACE-5.6.4/ACE_wrappers
@SET BOOST_1_40_ROOT=E:/opensource/boost_1_40_0
@SET CPPUNIT_ROOT=E:/opensource/cppunit-1.12.1
@if "%VSINSTALLDIR%"=="" gotoerror_no_VSINSTALLDIR
@if "%VCINSTALLDIR%"=="" gotoerror_no_VCINSTALLDIR
@echo Setting environment for using Microsoft VisualStudio 2005 x86 tools.
@rem
@rem Root of Visual Studio IDE installed files.
@rem
@set DevEnvDir=D:/Program Files/Microsoft Visual Studio8/Common7/IDE
@set PATH =D:/Program Files/Microsoft Visual Studio8/Common7/IDE;D:/Program Files/Microsoft Visual Studio 8/VC/BIN;D:/ProgramFiles/Microsoft Visual Studio 8/Common7/Tools;D:/Program Files/Microsoft VisualStudio 8/Common7/Tools/bin;D:/Program Files/Microsoft Visual Studio8/VC/PlatformSDK/bin;D:/Program Files/Microsoft Visual Studio8/SDK/v2.0/bin;C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727;D:/Program Files/MicrosoftVisual Studio 8/VC/VCPackages;%PATH%
@set INCLUDE =D:/Program Files/Microsoft Visual Studio8/VC/ATLMFC/INCLUDE;D:/Program Files/Microsoft Visual Studio8/VC/INCLUDE;D:/Program Files/Microsoft Visual Studio8/VC/PlatformSDK/include;D:/Program Files/Microsoft Visual Studio8/SDK/v2.0/include; %ACE_ROOT%;%BOOST_1_40_ROOT%;%CPPUNIT_ROOT%/include;%INCLUDE%
@set LIB =D:/Program Files/Microsoft Visual Studio8/VC/ATLMFC/LIB;D:/Program Files/Microsoft Visual Studio 8/VC/LIB;D:/ProgramFiles/Microsoft Visual Studio 8/VC/PlatformSDK/lib;D:/Program Files/MicrosoftVisual Studio 8/SDK/v2.0/lib; %ACE_ROOT%/lib;%BOOST_1_40_ROOT%/stage/lib;%CPPUNIT_ROOT%/lib;%LIB%
@set LIBPATH=C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727;D:/Program Files/MicrosoftVisual Studio 8/VC/ATLMFC/LIB
@goto end
:error_no_VSINSTALLDIR
@echo ERROR: VSINSTALLDIR variable is not set.
@goto end
:error_no_VCINSTALLDIR
@echo ERROR: VCINSTALLDIR variable is not set.
@goto end
:end
红色部分即为添加的内容。
Appendix:笔者机器上的环境变量
C:/Documents and Settings/zubo.yu/Desktop>echo %PATH%
C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;D:/ProgramFiles/Cppcheck/;C:/Program Files/
Rational/ClearCase/bin;C:/Program Files/CommonFiles/Thunder Network/KanKan/Codecs;C:/Program Files/
Rational/common;D:/ProgramFiles/TortoiseSVN/bin;D:/Program Files/UltraEdit/;E:/opensource/ACE-5.6.4
/ACE_wrappers/lib;D:/Program Files/Microsoft VisualStudio 8/VC/BIN;D:/Program Files/Microsoft Visua
l Studio 8/VC/PlatformSDK/bin;D:/Program Files/MicrosoftVisual Studio 8/Common7/IDE;D:/Program File
s/Microsoft Visual Studio 8/Common7/Tools;D:/ProgramFiles/Microsoft Visual Studio 8/Common7/Tools/b
in;D:/Program Files/Microsoft Visual Studio8/SDK/v2.0/bin;C:/WINDOWS/Microsoft.NET/Framework/v2.0.5
0727;D:/Program Files/Microsoft Visual Studio8/VC/VCPackages;
C:/Documents and Settings/zubo.yu/Desktop>echo %INCLUDE%
D:/Program Files/Microsoft Visual Studio8/VC/ATLMFC/INCLUDE;D:/Program Files/Microsoft Visual Studi
o 8/VC/INCLUDE;D:/Program Files/Microsoft Visual Studio8/VC/PlatformSDK/include;D:/Program Files/Mi
crosoft Visual Studio8/SDK/v2.0/include;E:/opensource/ACE-5.6.4/ACE_wrappers;E:/opensource/boost_1_
40_0;E:/opensource/cppunit-1.12.1/include
C:/Documents and Settings/zubo.yu/Desktop>echo %LIB%
D:/Program Files/Microsoft Visual Studio8/VC/ATLMFC/LIB;D:/Program Files/Microsoft Visual Studio 8/
VC/LIB;D:/Program Files/Microsoft Visual Studio8/VC/PlatformSDK/lib;D:/Program Files/Microsoft Visu
al Studio8/SDK/v2.0/lib;E:/opensource/ACE-5.6.4/ACE_wrappers/lib;E:/opensource/boost_1_40_0/stage/l
ib;E:/opensource/cppunit-1.12.1/lib
画线部分为手动配置中新加入的目录。
三、
前提:确保已经安装vc6或者vs系列
我们可以再命令行直接编译c++程序
在windows操作系统中,打开命令行,输入cl,若系统提示
'cl' 不是内部或外部命令,也不是可运行的程序或批处理文件。
则说明VS没有安装或者环境变量设置不正确,可以按照如下步骤设置:
1. 确保已经安装VS,并在控制台 中键入set
检查是否有类似如下格式的环境变量VSXXCOMNTOOLS
VS90COMNTOOLS=D:\ProgramFiles\Microsoft Visual Studio 9.0\Common7\Tools\
其中XX与VS版本有关:
a) VS2003对应 VS71COMNTOOLS
b) VS2005对应VS80COMNTOOLS
c) VS2008对应VS90COMNTOOLS
如果没有则执行步骤2;否则执行步骤3
2. 在我的电脑>属性>高级>环境变量>系统变量中新建一个环静变量
变量名: VSXXCOMNTOOLS
变量值: VS安装目录\Common7\Tools\
重复执行步骤1
3. 在控制台中键入
>call"%VS90COMNTOOLS%"vsvars32.bat <==设置cl运行时的一些环境变量
>cl
确保没有提示出错;否则重复步骤1
注意:用set设置环境变量,只能保证在本命令行中生效,命令行窗口一旦关闭,设置就失效了。要想设置也作用于其他命令行窗口,通过我的电脑->环境变量来设置
cl使用简介
cl有很多选项,请通过cl /?获取完整列表。这里列出了一些最重要的选项(选项的前缀可以是'-'或'/'),并且有例子。
无选项
>cl foo.cbar.c <==编译出foo.obj,bar.obj并自动调用链接器link链接得到foo.exe
/c 只编译不链接
>cl /c foo.cbar.c <==编译出foo.obj,bar.obj,但不调用链接器
/link<lib> 指定要链接的Library
> cl /link kernel32.lib foo.c <==编译出foo.obj,并链接kernel32.lib,得到foo.exe
/I<dir> 把目录加入include搜录路径中
/D<name>{=|#}<text>定义预处理器
>cl /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE <==定义2个预处理器
cl常用选项
/c 只编译不链接
/O2 设定速度最优化
/W3 设定警告等级3
cl相关解释
关于CRT的更多解释
如何禁止警告4996
/D_CRT_SECURE_NO_DEPRECATE 关闭warning:4996(表示strcpy不安全的warning等)
/D_CRT_NONSTDC_NO_DEPRECATE 非标准C也关闭warning:4996
/MD 更多关于CRT的解释
link使用简介
link有很多选项,完整列表见http://msdn.microsoft.com/zh-tw/library/y0zzbyt4.aspx,下面仅列出一些常用选项
[/debug] 产生调试信息
link /out:main.exe main.obj <==链接main.obj并生成main.exe
[/pdb:<target>]产生调试符号文件
link /debug /out:main.exe main.obj <==链接main.obj并生成带有调试信息的main.exe
[/out:<target>]指定输出文件
link /debug /pdb:main.pdb /out:main.exe main.obj <==链接main.obj并生成带有调试信息的main.exe以及调试符号文件main.pdb
[/subsystem:<target>]指定子系统http://msdn.microsoft.com/zh-cn/library/fcc1zstk.aspx
link /subsystem:windows /out:main.exe main.obj kernel32.lib user32.libgdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.liboleaut32.lib uuid.lib odbc32.lib odbccp32.lib <== 编译windows程序,入口函数自动设为WinMain,其中kernel32.lib,...,odbccp32.lib等为windows程序必须链接的lib
[/libpath:<dir>]把目录加入lib搜索路径中。如果有多个路径,则要写多次/libpath
link /libpath:../common /out:main.exe main.objlua.lib <== 链接../common中的lua.lib
值得注意的是:
如果同时提供main和WinMain,那么必须手工指定/subsystem
如果只提供main,则链接器自动指定/subsystem:console
应用实例
通常我们把cl和link分开使用:下面是编译lua的一段脚本
cl /MD /O2 /W3 /c/D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE /DLUA_BUILD_AS_DLL l*.c
del lua.obj luac.obj <==上述cl编译所有的l*.c,而lua.obj和luac.obj是不需要link的,所以删除之
link /DLL /out:lua51.dll l*.obj