命令行下使用cl命令设置

 

此文档集合了三篇文章的内容,分别是:

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.batbat是批处理文件的后缀,保存类型选择:所有文件(这个尤其需要注意),假设其保存路径也是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.libWindows系统文件,通过Windows自带的搜索工具,我们看到此文件在文件夹C:\ProgramFiles\Microsoft SDKs\Windows\v7.0A\Lib里,我们可以将其加到cpp文件所在的文件夹或bin文件里。再次键入cl hello.cpp,我们发现这次程序被成功编译链接了,cpp文件所在的文件夹里多了两个文件:hello.objhello.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

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值