编译工具的使用

编译长生OBJ文件,链接产生exe/dll。

cl.exe 是控制 Microsoft C 和 C++ 编译器与链接器的 32 位工具。可编译成ojb,也可生成可执行文件 (.exe) 或动态链接库文件 (DLL)。
link.exe 是将目标文件和库链接起来以创建 32 位可执行(.exe) 文件或动态链接库 (DLL) 的 32 位工具。
rc.exe 是将windows资源文件(.rc)编译成资源文件(.res),从而与目标文件链接,一般用于设置exe文件的图标和属性或者dll包含的资源。
lib.exe 是将目标文件链接生成静态库文件(.lib),也可以用于生成dll的lib文件。

用法:
CL [option...] file... [option | file]... [lib...] [@command-file] [/link link-opt...]
option : 一个或多个 CL 选项。
file : 一个或多个源文件、.obj 文件或库的名称。CL 编译源文件并将 .obj 文件和库的名
称传递给链接器。有关更多信息,请参见 CL 文件名语法。
lib : 一个或多个库名。CL 将这些名称传递给链接器。
command-file: 包含多个选项和文件名的文件。有关更多信息,请参见 CL 命令文件。
link-opt : 一个或多个链接器选项。CL 将这些选项传递给链接器
---------
参数解释:
/c 代表只编译不链接。
/I 指定头文件的目录。
/link : 将指定的选项传递给 LINK

@   指定响应文件。

例子:
cl *.cpp /G7 /MD /Ox /Ot /W3 /c /EHsc /I"G:/Visual C++/VC98/PlatformSDK/Include"
MFC开发如下:
编译源代码:
cl *.cpp /Ox /Ot /G7 /D "WIN32" /D "_WINDOWS" /D "_AFXDLL" /EHsc /MD /arch:SSE2 /W3 /c
资源编译 :
rc /l 0x804 winmfc.rc
链接 :
link *.obj WinMFC.res /out:WinMFC.exe /OPT:NOWIN98 /SUBSYSTEM:WINDOWS /MACHINE:X86

VC 的工程文件说明

dsw, aps, clw, plg这些文件都可以删除。只保留 H,C,CPP,DSP,RC,剩余文件去除只读属性,其余全部删除。然后打开DSP 有提示选 YES,就可以了。   
    *.dsp(DeveloperStudio Project):是VC++的工程配置文件,比如说你的工程包含哪个文件,你的编译选项是什么等等,编译的时候是按照.dsp的配置来的。
    *.dsw(DeveloperStudio Workspace):是工作区文件,用来配置工程文件的。它可以指向一个或多个.dsp文件。
    *.clw:是 ClassWizard信息文件,实际上是INI文件的格式,有兴趣可以研究一下.有时候ClassWizard出问题,手工修改CLW文件可以解决.如果此文件不存在的话,每次用ClassWizard的时候绘提示你是否重建。
    *.opt:工程关于开发环境的参数文件,如工具条位置等信息。
    *.aps:(AppStudio File),资源辅助文件,二进制格式,一般不用去管他,删了会新建。
    *.rc:资源文件。在应用程序中经常要使用一些位图、菜单之类的资源, VC中以rc为扩展名的文件称为资源文件, 其中包含了应用程序中用到的所有的windows资源, 要指出的

一点是rc文件可以直接在VC集成环境中以可视化的方法进行编辑和修改。
    *.plg:是编译信息文件,编译时的error和warning信息文件(实际上是一个html文件,一般用处不大),在Tools->Options里面有个选项可以控制这个文件的生成。
    *.hpj:(Help Project)是生成帮助文件的工程,用microsfot Help Compiler可以处理。
    *.mdp:(Microsoft DevStudio Project)是旧版本的项目文件,如果要打开此文件的话,会提示你是否转换成新的DSP格式。
    *.bsc:是用于浏览项目信息的,如果用Source Brower的话就必须有这个文件。如果不用这个功能的话,可以在Project Options里面去掉Generate Browse Info File,可以加快

编译速度。
    *.map:是执行文件的映像信息纪录文件,除非对系统底层非常熟悉,这个文件一般用不着。
    *.pch:(Pre-Compiled File)是预编译文件,可以加快编译速度,但是文件非常大。
    *.pdb:(Program Database)记录了程序有关的一些数据和调试信息,在调试的时候可能有用。
    *.exp:只有在编译DLL的时候才会生成,记录了DLL文件中的一些信息。一般也没什么用。
    *.ncb:无编译浏览文件(no compile browser)。当自动完成功能出问题时可以删除此文件,build后会自动生成,删了会新建。
    *.c:源代码文件,按C语言用法编译处理。
    *.cpp:源代码文件,按C++语法编译处理。
    *.h是头文件,一般用作声明和全局定义。
    *.sln:在开发环境中使用的解决方案文件。它将一个或多个项目的所有元素组织到单个的解决方案中。此文件存储在父项目目录中.解决方案文件,他是一个或多个.proj(项

目文件)的集合。
    *.vcproj 是vc的工程项目文件 
    .vcproj .sln 分别是VC2002以上工程文件和解决方案文件
    .dsp .dsw 分别是VC6的工程文件和工程组文件

Depends

VC6.0自带的Depends软件,该软件在VC6安装目录下的tools文件夹里面,既Microsoft Visual Studio\Common\Tools中,直接双击执行,然后打开exe文件即可,它主要有下面几个注意事项:

       1)所编的软件所需的Dll文件,可以得到相应的Dll路径,版本,属性等。

       2)窗口分四部分:
              左上角是Dll信息窗口,显示你程序所需的Dll模块,
              右边第一个窗口是所选的Dll模块所使用的函数,
              右边第二个窗口是所选Dll模块的所有的导出函数,
              下面窗口是所有需要的Dll模块的属性

       3)右边两个窗口出现四个标签:序号,提示,函数,入口点
如果利用导出是函数,那么出现函数名,如果导出的是序号,那么函数项就是N/A(无法显示)出现红色提示表示不正常,一般为没有该导出函数

       4)该工具得到的是你软件中隐式链接的Dll库,也就是用lib关联的Dll模块,无法显示显式链接的Dll模块,也就是用LoadLibrary函数导入的Dll函数。(切记切记!)

       5)无法提供Borland C++ Builder所提供的Dll文件,无法提供vxd软件的调用。

MTD与MDD

MTD指的是使用的运行时库为静态库LIBCRTD.LIB,MDD则使用动态库MSVCRTD.DLL运行时库作为链接版本;常见的选项还有:
Single thread(static link) ML               libc.lib
Debug single thread(static link) MLd        libcd.lib
MultiThread(static link) MT                 libcmt.lib
Debug multiThread(static link) MTd          libcmtd.lib
MultiThread(dynamic link) MD                msvert.lib
Debug multiThread(dynamic link) MDd         msvertd.lib

这些选项告诉编译器应用程序想使用什么版本的C标准程序库。/ML(缺省选项)对应单线程静态版的标准程序库(libc.lib);/MT对应多线程静态版标准库(libcmt.lib),此时编译器会自动定义_MT宏;/MD对应多线程DLL版(导入库msvcrt.lib,DLL是msvcrt.dll),编译器自动定义_MT和_DLL两个宏。后面加d的选项都会让编译器自动多定义一个_DEBUG宏,表示要使用对应标准库的调试版,因此/MLd对应调试版单线程静态标准库(libcd.lib),/MTd对应调试版多线程静态标准库(libcmtd.lib),/MDd对应调试版多线程DLL标准库(导入库msvcrtd.lib,DLL是msvcrtd.dll)。

编译器的版本

     MS VC++ 9.0 _MSC_VER = 1500
  MS VC++ 8.0 _MSC_VER = 1400
  MS VC++ 7.1 _MSC_VER = 1310
  MS VC++ 7.0 _MSC_VER = 1300
  MS VC++ 6.0 _MSC_VER = 1200
  MS VC++ 5.0 _MSC_VER = 1100
  其中MS VC++ 10就是Visual C++ 2010,MS VC++ 9.0就是Visual C++ 2008,MS VC++ 8.0就是Visual C++ 2005。

字符集

Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字符。Windows NT的所有与字符有关的函数都提供两种方式的版本,而Windows 9x只支持ANSI方式。_T一般同字常数相关,如_T("Hello")。如果你编译一个程序为ANSI方式,_T实际不起任何作用。而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律以以UNICODE方式保存。

try{} catch(…){}

以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的。例如下面的代码:
try
{
BYTE* pch ;
pch = ( BYTE* )00001234 ;   //给予一个非法地址
 
*pch = 6 ; //对非法地址赋值,会造成Access Violation 异常
}
catch(...)
{
AfxMessageBox( "catched" ) ;
}
这段代码在debug下没有问题,异常会被捕获,会弹出”catched”的消息框。 但在Release方式下如果选择了编译器代码优化选项,则VC编译器会去搜索try块中的代码, 如果没有找到throw代码, 他就会认为try catch结构是多余的, 给优化掉。 这样造成在Release模式下,上述代码中的异常不能被捕获,从而迫使程序弹出错误提示框退出。
那么能否在release代码优化状态下捕获这个异常呢, 答案是有的。 就是__try, __except结构, 上述代码如果改成如下代码异常即可捕获。
__try
{
BYTE* pch ;
pch = ( BYTE* )00001234 ;   //给予一个非法地址
 
*pch = 6 ; //对非法地址赋值,会造成Access Violation 异常
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
AfxMessageBox( "catched" ) ;
}
但是用__try, __except块还有问题, 就是这个不是C++标准, 而是Windows平台特有的扩展。 而且如果在使用过程中涉及局部对象析构函数的调用,则会出现C2712 的编译错误。 那么还有没有别的办法呢?
当然有, 就是仍然使用C++标准的try{}catch(..){}, 但在编译命令行中加入 /EHa 的参数。这样VC编译器不会把try catch模块给优化掉了。

VC2010

1 include怎么设置右键一个Project,可以发现有两个地方设置Include的相关目录:
1. VC++ Directories -> Include Directories
2. C/C++ -> General -> Additional Include Directories

不知道具体有什么区别,后在MSDN上得到答案:
“VC++ Directories -> Include Directories” : Directory settings displayed in the window are the directories that Visual Studio will search for include files referred to in your source code files. Corresponds to environment variable INCLUDE. More information : http://msdn.microsoft.com/en-us/library/t9az1d21(v=vs.80).aspx

“C/C++ -> General -> Additional Include Directories”: The directory to be added to the list of directories searched for include files. More information :http://msdn.microsoft.com/en-us/library/73f9s62w(v=vs.80).aspx
下面那个链接讲的比较清楚了:
The compiler searches for directories in the following order:
1.Directories containing the source file.
2.Directories specified with the /I option, in the order that CL encounters them.
3.Directories specified in the INCLUDE environment variable.

order2中的/I是由C/C++ -> General -> Additional Include Directories设置的。
order3中的INCLUDE是由VC++ Directories -> Include Directories设置的。

 

 VC2008发布

要将项目部署到其它电脑,需要安装 Microsoft Visual C++ 2008 Redistributable Package,否则会提示错误:系统无法执行指定的程序(The system cannot execute the specified program.)。
Microsoft Visual C++ 2008 Redistributable Package 下载地址:
x86 版:http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf
x64 版:http://www.microsoft.com/downloads/details.aspx?FamilyID=bd2a6171-e2d6-4230-b809-9a8d7548c1b6

关于 xxxx.exe 中的 0xxxxxxxx 处最可能的异常: 0xC0000005: 读取位置 0xxxxxxxx 时发生访问冲突

在软件运行时,在VS的输出窗口中,有可能出现如标题的错误提示,但程序又运行无误。解决方案是:“调试”->“异常”,将左边的全勾上,如果再出现以上的运行时错误提示,就可以中断到调试器,便可以通过查看调用堆栈解决了。

初始化 Microsoft Visual SourceSafe 源代码管理提供程序时失败。您无法使用此提供程序执行源代码管理操作
vs2005安装完后,打开项目时候出现“初始化 Microsoft Visual SourceSafe 源代码管理提供程序时失败。您无法使用此提供程序执行源代码管理操作”的提示,一般没什么问题,只是在某些其他css时需注意加载即可!
如果你觉得看着不舒服,可以采用如下法取消:
单击“工具”—>“自定义”->“键盘”(左下角)->“源代码管理”,将当前源代码管理改为无即可。

Visual Studio 2008试用版的评估期已经结束解决方法

    以前在Windows2003碰到这个问题时,都是到"控制面板→添加或删除程序"选择删除VS2008,然后会有个地方让输入序列号升级就可以了,但这次没有输序列号的地方:需下载一款CrackVS2008ForWindows7的软件将输入框显示出来即可。破解方法:

1. 破解前,先到“控制面板”的“添加删除程序”中,启动“VS2008的安装卸载程序”维护界面
2. 再打开解压好的文件“crackvs2008forwindows7”
3. 输入相应的序列号(PYHYP-WXB3B-B2CCM-V9DX9-VDY8T)即可以啦。

命令行的设置与解析

在“属性”-》“命令参数”里,输入参数,以空格做分割,解析的时候,argc为参数格式,至少为1,argv[0] 保存的时候本进程名。

vs2012创建新工程,提示“类不能支持Automation操作”。
查看系统补丁,卸载KB2833957和KB2840642这两个补丁,然后安装KB2781514补丁。

宏定义

$(RemoteMachine)
设置为“调试”属性页上“远程计算机”属性的值。有关更多信息,请参见更改用于 C/C++ 调试配置的项目设置。
$(References)
以分号分隔的引用列表被添加到项目中。
$(ConfigurationName)
当前项目配置的名称(例如“Debug”)。
$(PlatformName)
当前项目平台的名称(例如“Win32”)。
$(Inherit)
指定在由项目生成系统所撰写的命令行中,继承的属性出现的顺序。默认情况下,继承的属性出现在当前属性的末尾。
$(NoInherit)
使任何将被继承的属性不被继承。若还要避免同级级别的计算,请使用 $(StopEvaluating)。使用 $(NoInherit)会导致对于同一属性忽略任何出现的 $(Inherit)。
$(StopEvaluating)
立即停止计算链中宏的计算。出现在 $(StopEvaluating) 之后的任何值将不出现在宏的计算值中。如果$(StopEvaluating) 在 $(Inherit) 之前,计算链中当前位置的继承值将不会连接到宏值。$(StopEvaluating)是 $(NoInherit) 的功能超集。
$(ParentName)
包含此项目项的项的名称。该名称将是父文件夹名称或项目名称。
$(RootNameSpace)
包含应用程序的命名空间(如果有)。
$(IntDir)
为中间文件指定的相对于项目目录的目录路径。它解析为“中间目录”属性的值。
$(OutDir)
输出文件目录的路径,相对于项目目录。这解析为“输出目录”属性的值。
$(DevEnvDir)
Visual Studio .NET 的安装目录(定义形式:驱动器 + 路径);包括尾部的反斜杠“\”。
$(InputDir)
输入文件的目录(定义形式:驱动器 + 路径);包括尾部的反斜杠“\”。如果该项目是输入,则此宏等效于 $(ProjectDir)。
$(InputPath)
输入文件的绝对路径名(定义形式:驱动器 + 路径 + 基本名称 + 文件扩展名)。如果该项目是输入,则此宏等效于 $(ProjectPath)。
$(InputName)
输入文件的基本名称。如果该项目是输入,则此宏等效于 $(ProjectName)。
$(InputFileName)
输入文件的文件名(定义为基本名称 + 文件扩展名)。如果该项目是输入,则此宏等效于 $(ProjectFileName)。
$(InputExt)
输入文件的文件扩展名。它在文件扩展名的前面包括“.”。如果该项目是输入,则此宏等效于 $(ProjectExt)。
$(ProjectDir)
项目的目录(定义形式:驱动器 + 路径);包括尾部的反斜杠“\”。
$(ProjectPath)
项目的绝对路径名(定义形式:驱动器 + 路径 + 基本名称 + 文件扩展名)。
$(ProjectName)
项目的基本名称。
$(ProjectFileName)
项目的文件名(定义为基本名称 + 文件扩展名)。
$(ProjectExt)
项目的文件扩展名。它在文件扩展名的前面包括“.”。
$(SolutionDir)
解决方案的目录(定义形式:驱动器 + 路径);包括尾部的反斜杠“\”。
$(SolutionPath)
解决方案的绝对路径名(定义形式:驱动器 + 路径 + 基本名称 + 文件扩展名)。
$(SolutionName)
解决方案的基本名称。
$(SolutionFileName)
解决方案的文件名(定义为基本名称 + 文件扩展名)。
$(SolutionExt)
解决方案的文件扩展名。它在文件扩展名的前面包括“.”。
$(TargetDir)
生成的主输出文件的目录(定义形式:驱动器 + 路径);包括尾部的反斜杠“\”。
$(TargetPath)
生成的主输出文件的绝对路径名(定义形式:驱动器 + 路径 + 基本名称 + 文件扩展名)。
$(TargetName)
生成的主输出文件的基本名称。
$(TargetFileName)
生成的主输出文件的文件名(定义为基本名称 + 文件扩展名)。
$(TargetExt)
生成的主输出文件的文件扩展名。它在文件扩展名的前面包括“.”。
$(VSInstallDir)
安装 Visual Studio .NET 的目录。
$(VCInstallDir)
安装 Visual C++ .NET 的目录。
$(FrameworkDir)
安装 .NET Framework 的目录。
$(FrameworkVersion)
Visual Studio 使用的 .NET Framework 版本。与 $(FrameworkDir) 相结合,就是 Visual Studio 使用的 .NET Framework 版本的完整路径。
$(FrameworkSDKDir)
安装 .NET Framework SDK 的目录。.NET Framework SDK 可作为 Visual Studio .NET 的一部分安装,也可单独安装。
$(WebDeployPath)
从 Web 部署根到项目输出所属于的位置的相对路径。返回与 RelativePath 相同的值。
$(WebDeployRoot)
指向 <localhost> 位置的绝对路径。例如,c:\inetpub\wwwroot。
$(SafeParentName)
有效名称格式的直接父级的名称。例如,窗体是 .resx 文件的父级。
$(SafeInputName)
作为有效类名的文件的名称,但不包括文件扩展名。
$(SafeRootNamespace)
项目向导将在其中添加代码的命名空间名称。此命名空间名称将只包含在有效的 C++ 标识符中允许的字符。
$(FxCopDir)
fxcop.cmd 文件的路径。fxcop.cmd 文件不和所有的 Visual C++ 版本一起安装。

VC助手2012安装不成功

要将破解后的VA_X.dll放到扩展目录(例如 C:\Users\用户名\AppData\Local\Microsoft\VisualStudio\11.0\Extensions\wibcp0ml.p0t 后面这个名字可能有差异)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山西茄子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值