Visual Studio 2008 常见错误解决之设置预编译头
vs2008头文件错误提示
vs2008头文件错误提示d:\program files\microsoft visual studio 9.0\vc\include\new. h(60) : error C2065: “_In_opt_”:未声明的标识符d:\program files\microsoft visual studio 9.0\vc\include\new. h(60) : error C2146: 语法错误 : 缺少“)”(在标识符“new_handler”的前面)d:\program files\microsoft visual studio 9.0\vc\include\new. h(60) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符d:\program files\microsoft visual studio 9.0\vc\include\new. h(60) : error C2491: “std::set_new_handler”:不允许 dllimport 数据的定义d:\program files\microsoft visual studio 9.0\vc\include\new. h(60) : error C2059: 语法错误 : “)”d:\program files\microsoft visual studio 9.0\vc\include\new. h(85) : error C2065: “_Size”:未声明的标识符d:\program files\microsoft visual studio 9.0\vc\include\new. h(118) : error C2143: 语法错误 : 缺少“;”(在“__cdecl”的前面) d:\program files\microsoft visual studio 9.0\vc\include\new. h(119) : error C2143: 语法错误 : 缺少“;”(在“__cdecl”的前面) d:\program files\microsoft visual studio 9.0\vc\include\new. h(119) : error C2065: “_In_opt_”:未声明的标识符d:\program files\microsoft visual studio 9.0\vc\include\new. h(119) : error C2146: 语法错误 : 缺少“)”(在标识符“_PNH”的前面)d:\program files\microsoft visual studio 9.0\vc\include\new. h(119) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符d:\program files\microsoft visual studio 9.0\vc\include\new. h(119) : error C4430: 缺少类型说明符 - 假定为 int。
VisualStudio2008安装64位编译组件
VisualStudio2008安装64位编译组件背景:因为一些项目是C#写就的,逼得本来只装VC的我要加装C#套件。
我机器上的VS2008/2010都只装了VC套件。
VS2008的补丁已经打到SP2,VS2010打到SP1。
VS2008增加C#套件的过程:1、先加装VS2008的C#套件。
装入VS2008.iso,安装程序没进入套件选择的步骤,就弹出对话框提示异常“A problem has been encountered while loading the setup components. Canceling setup.”。
google到解决方案:“”。
简而言之就是,增删套件不要通过源盘VS2008.iso进行,而是通过windows控制面板上的“程序和功能”(/Win7的说法)进行。
2、DAEMONtools保留着装入的VS2008.iso在H:盘上。
开始从“程序和功能”增删VS2008,增加其C#套件。
待安装程序进入到套件选择的步骤,勾上以增加C#套件,点击“Next”,却又有提示异常“Setup is looking for file SQLSysClrTypes.msi. Please insert Microsoft Visual Studio Team System 2008 Team Suite – ENU disk 1 now.”。
但是,在VS2008.iso(/亦即H:)里找不到大神SQLSysClrTypes.msi。
3、DAEMONtools继续保留着装入的VS2008.iso在H:盘上。
装入VS2008's patch.iso(/应该是VS2008的SP2了)至I:盘,SQLSysClrTypes.msi就在I:\vs90sp1里。
但是,安装程序老蠢死掘不认此目录,再叠加弹出一对话框叫我“确认”。
拷贝到其它目录下再哄她,也不行。
艹!4、Google到解决方案:“”。
关于VC编译错误fatal error C1083的解决办法
关于VC编译错误fatal error C1083的解决办法这时因为该模块没有包括预编译头文件“stdafx.h”的缘故。
VC用一个stdafx.cpp包含头文件stdafx.h,然后在stdafx.h里包含大部分系统头文件,这样编译时VC就通过编译stdafx.cpp把大部分系统头文件预编译进来了,在Debug目录下有一个很大的文件*.pch,这里就存储了预编译信息。
根据这个原理,如果这个pch损坏了或被删除了,系统重新编译时就会抱怨“cannot openprecompiled header file debug/*.pch”。
这时怎么解决这个问题呢,打开Project-》Setting对话框选C++页,将Category下拉式列表框选中Precompiled Headers,最简单的办法就是选中第一个选项“Not using....",这样就根本不用预编译头也不去寻找pch文件,就不会出错了,但是这样做的后果是每次编译、连接都化更多的时间。
第二个选项”Automatic ...",然后在“Through header”力填上stdafx.h,这样如果没有pch文件系统会自动生成一个pch,如果有的话就使用这个pch,这个选项是比较“智能”的。
第三个选项是强行创建一个pch文件,第四个选项是直接使用pch文件。
当然“Throughheaders”里都填stdafx.h了。
1.nafxcwd.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argvnafxcwd.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argcnafxcwd.lib(timecore.obj) : error LNK2001: unresolved external symbol __mbctypenafxcwd.lib(apphelp.obj) : error LNK2001: unresolved external symbol __mbctypenafxcwd.lib(filelist.obj) : error LNK2001: unresolved external symbol __mbctype解决办法:PROJECT->SETING->C/C++->PREPROCESSOR->定义 _AFXDLL,完毕。
PCL配置即常见问题
PCL配置即常见问题1 下载把与VS版本对应PCL的AllInOne包下载下来。
要下对安装包,需要了解安装包的命名的含义,以下⾯的⼀个AllInOne包的名字为例。
PCL-1.8.0-AllInOne-msvc2013-win32.exe其中,1.8.0表⽰的PCL的版本号,然后2013表⽰这个安装包只适⽤于VS2013中使⽤,其它VS版本不⾏,最后win32表⽰这个安装包只能⽤来开发32位的程序。
再以下⾯的安装包名字为例。
PCL-1.7.2-AllInOne-msvc2012-win64.exe这个安装包是PCL1.7.2版本的,其只能⽤在VS2012上,然后使⽤在64位的VS项⽬开发中。
注意⼀定要下载正确与VS版本以及想要开发的程序位数对应的AllInOne包。
2 安装整个安装过程需要注意以下三点,其它默认即可:1. 安装路径最好不要包括中⽂;2. 建议勾选上“AddPCLtothesystemPATHforallusers”;3. 安装时,会提⽰安装OpenNI,这个建议安装在PCL安装路径的3rdParty下的OpenNI2⽂件夹中。
3 新建⼀般在VS⾥创建⼀个C++的控制台项⽬,根据⾃⼰的意愿设置⼀下项⽬名和路径。
在新建过程中注意以下两点,其它默认即可:1. 去掉“预编译头(P)”前的勾2. 去掉“安全开发⽣命周期(SDL)检查(C)”前的勾。
4 配置在配置项⽬属性环节,需要了解的是编译出来的程序分为两种32位和64位。
不同位数的程序需要对应版本的lib和dll才能编译成功。
这⾥想要编译什么位数的程序,下载对应位数的PCL即可。
不同位数的程序⼜分为:Debug和Release。
默认⽣成的是Debug程序。
编译Debug版本的程序需要Debug版本的lib和dll,编译Release版本的程序需要Release版本的lib和dll。
这些lib和dll在PCL的安装路径路径⾥有。
如果需要⽣成上述四种程序,需要分别设置对应的项⽬属性表。
VC中常见的一些编译链接错误的解决
VC中常见的一些编译链接错误的解决VC中常见的一些编译链接错误的解决2010-03-22 15:59问题1:Linking...nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadexnafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadexlibcd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main答VC++默认的工程设置是单线程的,而你使用了多线程,所以要修改设置。
选择菜单“Project|settings”,选择C/C++标签,在CODEGENERATION分类中选择除SINGLE-THREADED的其他选择。
比如可以在Use run-time library中选择Debug Multithreaded 或者multithreaded其中,Single-Threaded 单线程静态链接库(release版本) Multithreaded 多线程静态链接库(release版本) multithreaded DLL 多线程动态链接库(release版本)Debug Single-Threaded 单线程静态链接库(debug版本)Debug Multithreaded 多线程静态链接库(debug版本)Debug Multithreaded DLL 多线程动态链接库(debug版本)单线程: 不需要多线程调用时, 多用在DOS环境下多线程: 可以并发运行静态库: 直接将库与程序Link, 可以脱离MFC库运行动态库: 需要相应的DLL动态库, 程序才能运行release版本: 正式发布时使用debug版本: 调试阶段使用问题2fatal error C1010: unexpected end of file while looking for precompiled header directive该如何解如果发生错误的文件是由其他的C代码文件添加进入当前工程而引起的,则Alt+F7进入当前工程的Settings,选择C/C++选项卡,从Category组合框中选中Precompiled Headers,选择Not Using Precompiledheaders。
解决VisualC++编译器中混合.c文件时收到C1853预编译头错误的方法
解决VisualC++编译器中混合.c文件时收到C1853预编译头错误的方法第一篇:解决Visual C++ 编译器中混合 .c 文件时收到 C1853 预编译头错误的方法解决Visual C++ 编译器中混合.c 文件时收到 C1853 预编译头错误的方法当Visual C++ 项目启用了预编译头(Precompiled header)功能时,如果项目中同时混合有.c 和.cpp 源文件,则可能收到 C1853 编译器错误:fatal error C1853: 'pjtname.pch' precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from C(or vice versa)(致命错误C1853: “filename.pch”预编译头文件来自编译器的早期版本,或者预编译头为C++ 而在C 中使用它(或相反))。
该错误是因为当项目中混合了.cpp 和.c 文件时,编译器会对它们采取不同的编译方式(主要是因为对函数声明的处理方式不同),因而不能共用一个预编译头文件。
在VC++ 中,默认的预编译头文件是针对 C++ 的(stdafx.h 和 stdafx.cpp),当然也可以创建针对 C 的预编译头。
有趣的是,在旧版的VC++ 中,这个错误的提示很具有误导性:fatal error C1853: 'xxx.pch' is not a precompiled header file created with this compiler.常常让人摸不着头脑。
应该说,在新版中的这个提示是有所改进的。
不过在网上搜索一番,对这个问题往往都是建议对整个项目取消预编译头的设置。
这显然不是一个好的解决方案。
Visual+C+++中fatal+error+C1083的解决办法
Visual C++ 中fatal error C1083的解决办法文/蹇安安最近在做VC开发的过程中遇到了这个烦人的问题,查阅了很多资料也没有一个统一的说法,所以把所有可能出现的情况都总结一下,供以后参考。
症状:fatal error C1083: Cannot open compiler intermediate file:“C:\WINDOWS\Temp\xxxx” No such file or directory或致命错误 C1083:无法打开编译器中间文件:< tmp 目录 >; \ < tmpfile >: 没有的文件或目录原因之一:有可能是环境变量设置不对。
user用户变量和system变量TEMP 和TMP的变量值都为%SystemRoot%\TEMP ,在正常机器上,这是没有问题的,但是有的用户机器的系统盘是手动更改成C盘的,本来应该为E盘。
解决办法:将user用户变量和system变量TEMP和TMP的变量值都改为C:\WINDOWS\Temp原因之二:和预编译头的设置有关。
解决办法:打开Settings对话框,左边的Settings For中选中Release,底下的TreeView中选中StdAfx.cpp,右边选中C/C++标签页,Category选Precompiled Headers,底下选Create precompiled header,Through header 填StdAfx.h。
左边的TreeView中依次选中工程中其他所有的cpp,Precompiled Headers都选中Use precompiled header file,Through header填StdAfx.h。
最后,“OK”、“Rebuild All”。
原因三:该错误是由 TMP 环境变量的末尾分号引起的。
例如:TMP=C:\TMP;解决办法:从命令行设置 TMP 环境变量正确方法是,如下所示:C:\>SET TMP=C:\TMP非常重要的环境字符串不能结束用分号 (;),因为编译器将中间文件名追加到 TMP 路径。
VS预编译头文件(关于errorc1083的问题解决)
VS预编译头⽂件(关于errorc1083的问题解决)
报错
fatal error C1083:cannot open precompield header file 'Debug/*.pch':No such file or dir
原理
头⽂件的编译原理,就是把⾃⼰的内容替换掉对应的#include处。
头⽂件的出现,给书写程序带来了极⼤的便利,但到了windows时代,⼏乎所有windows程序都要包含windows.h,⽽它却硕⼤⽆⽐,#include处展开时,编译就很慢。
到了mfc时代就更恶劣了。
于是,这些⼏乎所有cpp都必须包含、且稳定不经常改变(否则要重新预编译)的头⽂件,被提取出来,只编译⼀遍,⼤家都能使⽤,这就是预编译头。
优点:速度⼤⼤提⾼,*.pch就是编译后的预编译头⽂件;
缺点:假定的是所有cpp都使⽤,因此再编译你的cpp时,就会将预编译头中编译完成的部分加载到内存,此时如果发现你cpp中居然没包含预编译头,就没办法把这部分从内存中请出去,编译失败;
使⽤
/Yc:即creat,创建预编译头,将你的预编译cpp设置成/Yc;
/Yu:即use,使⽤预编译头,将你其他cpp设置成/Yu,并在cpp最开头包含你预编译头的h⽂件(如stdafx.h,也可以⾃定义)
参考链接:。
关于编译错误 fatal error C1083 Cannot open precompiled header file
我到网上查了资料,顺便学习据我的项目开发经验,我总结了避免这个编译错误的一些方法:
(1)在菜单栏里的工程 -> 设置 -> C/C++ 中,预编译的的头文件选项卡,选择“不使用预补偿页眉”单选项就可以了。不过这种方法的缺点是以后每次编译都会比较慢。
(2)由于在大的工程里,有一些头文件经常使用,往往就会导致这样的编译错误。解决办法是把这些经常使用的头文件写入一个文件(比如 precompile.h)里,就如MFC程序里的stdAfx.h一样,然后在文件precompile.cpp文件里加入#include <precompile.h>即可。对于precompile.cpp在项目设置里选择“设置补偿页眉文件”,对于其他.cpp文件设置“使 用补偿页眉文件”。
下面是在网上看到的有关预编译头文件的机制,还是很有必要研究一下的。
预编译头的概念: 所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的 代码可以是任何的C/C++代码--------甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会被经常改变。如果这些代码被修改, 则需要重新编译生成预编译头文件。注意生成预编译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有6-7M大。注意及时清理那些没有用的预 编译头文件。 也许你会问:现在的编译器都有Time stamp的功能,编译器在编译整个工程的时候,它只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过的文件。那么为什么还 要预编译头文件呢?答案在这里,我们知道编译器是以文件为单位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有头文件中的东 西(.eg Macro, Preprocesser )都要重新处理一遍。VC的预编译头文件保存的正是这部分信息。以避免每次都要重新处理这些头文件。 预编译头的作用: 根据上文介绍,预编译头文件的作用当然就是提高便宜速度了,有了它你没有必要每次都编译那些不需要经常改变的代码。编译性能当然就提高了。 预编译头的使用: 要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch 文件)想必大家都知道 StdAfx.h这个文件。很多人都认为这是VC提供的一个“系统级别”的,编译器带的一个头文件。其实不是的,这个文件可以是任何名字的。我们来考察一 个典型的由AppWizard生成的MFC Dialog Based 程序的预编译头文件。(因为AppWizard会为我们指定好如何使用预编译头文件,默认的是StdAfx.h,这是VC起的名字)。我们会 发现这个头文件里包含了以下的头文件: #include <afxwin.h> // MFC core and standard components #include <afxext.h> // MFC extensions #include <afxdisp.h> // MFC Automation classes #include <afxdtctl.h> // MFC support for Internet Explorer 4Common Controls #include <afxcmn.h> 这些正是使用MFC的必须包含的头文件,当然我们不太可能在我们的工程中修改 这些头文件的,所以说他们是稳定的。 那么我们如何指定它来生成预编译头文件。我们知道一个头文件是不能编译的。所 以我们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件里只有一句代码就是:#include “Stdafx.h”。原因是理所当然的,我们仅仅是要它能够编译而已?D?D?D也就是说,要的只是它的.cpp的扩展名。我们可以用/Yc编译开关来 指定StdAfx.cpp来生成一个.pch文件,通过/Fp编译开关来指定生成的pch文件的名字。打开 project->Setting->C/C++ 对话框。把Category指向Precompiled Header。在左边的树形视图里选择整个工程 Project Options(右下角的那个白的地方)可以看到 /Fp “debug/PCH.pch”,这就是指定生成的.pch文件的名字,默认的通常是 <工程名>.pch(我的示例工程名就是PCH)。 然后,在左边的树形视图里选择StdAfx.cpp.//这时只能选一个 cpp文件!这时原来的Project Option变成了 Source File Option(原来是工程,现在是一个文件,当然变了)。在这里我们可以看到 /Yc开关,/Yc的作用就是指定这个文件来创建一个Pch文件。/Yc后面的文件名是那个包含了稳定代码的头文件,一个工程里只能有一个文件的可以有 YC开关。VC就根据这个选项把 StdAfx.cpp编译成一个Obj文件和一个PCH文件。 然后我们再选择一个其它的文件来看看,//其他cpp文件在这 里,Precomplier 选择了 Use ⋯⋯⋯一项,头文件是我们指定创建PCH 文件的stdafx.h文件。事实上,这里是使用工程里的设置,(如图1)/Yu”stdafx.h”。 这样,我们就设置好了预编译头文件。也就是说,我们可以使用预编译头功能了。以下是注意事项:1):如果使用了/Yu,就是说使用了预编译,我们在每个.cpp文件的最开头,我强调一遍是最开头,包含 你指定产生pch文件的.h文件(默认是stdafx.h)不然就会有问题。如果你没有包含这个文件,就告诉你Unexpected file end. 如果你不是在最开头包含的,你自己试以下就知道了,绝对有很惊人的效果⋯..fatal error C1010: unexpected end of file while looking for precompiledheader directiveGenerating Code...2)如果你把pch文件不小心丢了,编译的时候就会产生很多的不正常的行为。根据以上的分析,你只要让编译器生成一个pch文件。也就是说把 stdafx.cpp(即指定/Yc的那个cpp文件)从新编译一遍。当然你可以傻傻的 Rebuild All。简单一点就是选择那个cpp文件,按一下Ctrl + F7就可以了。不然可是很浪费时间的哦。
Microsoft Visual C++ 2008 发布程序的部署问题
Microsoft Visual C++ 2008 发布程序的部署问题VS2008编译的程序在Windows2008环境上运行时经常出现如下问题:应用程序事件日志如下:上述两个问题都解决后则可能还出现如下问题:注意:此时是调用dll出现问题了,而不是运行主程序出错。
主要问题是“找不到从属程序集Microsoft.VC90.MFC”,解决办法如下:将整个“C:\Application\Microsoft Visual Studio 9.0\VC\ redist\x86\Microsoft.VC90.MFC”拷贝到exe文件所在目录下,如果exe程序所涉及调用的dll与该exe文件不在同一目录,那么须要在dll所在目录也拷贝一份。
详细描述如下:这个问题有好多Blog和Forum已经讨论过了,但都不详尽,在具体的操作过程中还是有许多疑问。
我摘录并整合了许多网络文章,希望能够做个最终了结。
一、VC2005和VC2008编译出来的程序如何发布/lf426/archive/2008/04/12/46885.aspxVC2005和VC2008编译出来的程序放到别人的电脑上为什么有可能无法运行呢?1:Microsoft Visual C++ 2008 Express Edition可以发布软件吗?能!很多人说,因为是Express版,不是Studio,所以只是用来练习语言的,不能发布软件——错!除了没有MFC和ATL,基本上跟 .net 版本是一样的。
发布出来的,是完整的可执行文件。
2:VC 2008 (2005) 发布出来的程序必须附带上他们特定的dll文件吗?不一定。
如果目标系统是个经常升级的系统,微软已经为其打上了所需要的dll文件补丁了,不需要在软件包里面附加特定的dll文件。
特别在Vista系统中,你更是不需要VC8和VC9的dll文件。
但是在一些老版本的系统中,这些文件就是必须的。
3:VC2008和VC2005特定的dll文件是哪些?VC8: msvcm80.dll, msvcp80.dll, msvcr80.dllVC9: msvcm90.dll, msvcp90.dll, msvcr90.dll4:如何部署文件?首先,请选择release版本;在生成可执行文件(exe文件)的时候,会得到相应的部署文件(manifest文件)。
VC++编译器设置及错误一览
VC++编译器设置错误可能很多人在安装VC 6.0后有过点击“Compile”或者“Build”后被出现的“Compiling... ,Error spawning cl.exe”错误提示给郁闷过。
很多人的选择是重装,实际上这个问题很多情况下是由于路径设置的问题引起的,“CL.exe”是VC使用真正的编译器(编译程序),其路径在“VC根目录\VC98\Bin”下面,你可以到相应的路径下找到这个应用程序。
因此问题可以按照以下方法解决:打开vc界面点击VC“TOOLS(工具)”—>“Option (选择)”—>“Directories(目录)”重新设置“Excutable Fils、Include Files、Library Files、Source Files”的路径。
很多情况可能就一个盘符的不同(例如你的VC装在C,但是这些路径全部在D),改过来就OK了。
如果你是按照初始路径安装vc6.0的,路径应为:executatble files:C:\Program Files\Microsoft Visual Studio\Common\MSDev98\BinC:\Program Files\Microsoft Visual Studio\VC98\BINC:\Program Files\Microsoft Visual Studio\Common\TOOLSC:\Program Files\Microsoft Visual Studio\Common\TOOLS\WINNTinclude files:C:\Program Files\Microsoft Visual Studio\VC98\INCLUDEC:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDEC:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDElibrary files:C:\Program Files\Microsoft Visual Studio\VC98\LIBC:\Program Files\Microsoft Visual Studio\VC98\MFC\LIBsource files:C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRCC:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDEC:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDEC:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC如果你装在其他盘里,则仿照其路径变通就行(我就是装在D盘)。
MFC编译运行错误之无法打开预编译头文件
MFC编译运行错误之无法打开预编译头文件1。
用编辑程序,按Ctrl+F7,出现下列错误:fatal error C1083: 无法打开预编译头文件:“Debug/UGFace.pch”: No such file or directory解决方法:修改:项目->属性->C/C++ ->预编译头->不使用预编译头即可。
2。
学用Visual C++ 6.0的第一个例程就让我出了错.用向导生成第一个基于对话框的Project 之后,当我按照书上的源程序一个字一个字地输进去之后,始终有一个错误:fatal error C1010: unexpected end of file while looking for precompiled header directive.找了无数次之后,我决定把向导生成的包括头文件的语句:include"StdAfx.h"保留(而这之前我是把它删掉了的,因为书上的例子没有这句.)咦,这下就对了.这是为什么呢?我百思不得其解。
来到我的VC源代码目录,我注意到每个Project下面的DEBUG文件夹都特别大,而且一个扩展名为.pch的文件占去了绝大部分,我删掉之好像对程序编译运行没有什么影响。
于是抱着对.pch文件的好奇,我在网上搜到了我疑惑之处的解答。
这就是VC++6.0给我们带来的:预编译头文件。
预编译头文件(一般扩展名为.PCH),是把一个工程中较稳定的代码预先编译好放在一个文件(.PCH)里。
这些预先编译好的代码可以是任何的C/C++代码,甚至可以是inline函数,只是它们在整个工程中是较为稳定的,即在工程开发过程中不会经常被修改的代码。
为什么需要预编译头文件?一言以蔽之:提高编译速度.一般地,编译器以文件为单位编译。
如果修改了一工程中的一个文件则所有文件都要重新编译,包括头文件里的所有东西(eg.Macro宏,Preprocessor预处理),而VC程序中,这些头文件中所包括的东西往往是非常大的,编译之将占很长的时间。
cl.exe命令参数详解(精)
预编译头的问题总算解决了 2011.2.11 新的一年开始了 CL.exe link.exe 命令(转) 1、设置环境变量: PATH=C:\Program Files\Microsoft Visual Studio 8\VC\bin INCLUDE=C:\Program Files\Microsoft Visual Studio 8\VC\include LIB=C:\Program Files\Microsoft Visual Studio 8\VC\lib 如果提示找不到mspdb80.dll文件,则从C:\Program Files\Microsoft Visual Studio 8\Common7\IDE下拷贝―msobj80.dll,mspdb80.dll,mspdbcore.dll,mspdbsrv.exe‖这四个文件到C:\Program Files\Microsoft Visual Studio 8\VC\bin下即可。
2、命令选项: 1 /C:在预处理输出中保留注释语句 2 /c:只编译,不连接,相当于在"Build"菜单下选择了"Compile" 3 /D:定义常量和宏,与源程序里的#define 有相同效果 4 /E:预处理C、C++源文件,将源文件中所有的预编译指令及宏展开,将注释去掉,然后将预处理器的输出拷贝至标准输出设备输出,并且在每个文件的开头和末尾加入#line 5 /EH:指定编译器用何种异常处理模型 6 /EP:同/E,只是去掉了#line 7 /F:设置程序的堆栈大小 8 /FA:设置生成何种列表文件(汇编、汇编与机器码、汇编与源码、汇编与机器码以及源码) 9 /Fa:指定用/FA设置的列表文件的存放路径及(或)文件名 10 /FD:生成文件的相互依赖信息 11 /Fd:设置程序数据库文件(PDB)的存放路径及(或)文件名12 /Fe:设置最终可执行文件的存放路径及(或)文件名 13 /FI:预处理指定的头文件,与源文件中的#include有相同效果 14 /Fm:创建map文件 15 /Fo:设置编译后Obj文件的存放路径及(或)文件名 16 /Fp:设置预编译文件(pch)的存放路径及(或)文件名 17 /FR:生成浏览信息(sbr)文件 18 /Fr:同/FR,不同之处在于/Fr不包括局部变量信息 19 /G3:为80386处理器优化代码生成 20 /G4:为80486处理器优化代码生成 21 /G5:为Pentium处理器优化代码生成 22 /G6:为Pentium Pro处理器优化代码生成 23 /GA:为Windows应用程序作优化 24 /GB:为Pentium处理器优化代码生成,使用80386、80486、Pentium、Pentium Pro的混合指令集,是代码生成的默认选项(程序属性选项中Processor对应Blend) 25 /GD:为Windows动态库(dll)作优化,此开关在VC6中没有实现 26 /Gd:指定使用__cdecl的函数调用规则 27 /Ge:激活堆栈检测 28 /GF:消除程序中的重复的字符串,并将她放到只读的缓冲区中 29 /Gf:消除程序中的重复字符串 30 /Gh:在每个函数的开头调用钩子(hook)函数--penter 31 /Gi:允许渐进编译 32 /Gm:允许最小化rebuild 33 /GR:允许运行时类型信息(Run-Time Type Infomation 34 /Gr:指定使用__fastcall的函数调用规则 35 /Gs:控制堆栈检测所用内存大小 36 /GT:支持用__declspec(thread分配的数据的fier-safety 37/GX:允许同步异常处理,与/EHsc开关等价 38 /Gy:允许编译器将每一个函数封装成COMDATs的形式,供连接器调用 39 /GZ:允许在Debug build 的时候捕捉Release build的错误 40 /Gz:指定使用__stdcall的函数调用规则 41 /H:限制外部名字的长度42 /HELP:列出编译器的所有的命令开关 43 /I:指定头文件的搜索路径 44 /J:将char的缺省类型从signed char改成unsigned char 45 /LD:创建一个动态连接库 46 /LDd:创建一个Debug版本的动态链接库 47 /link:将指定的选项传给连接器 48 /MD:选择多线程、DLL版本的C Run-Time库 49 /MDd:选择多线程、DLL、Debug版本的C Run-Time库 50 /ML:选择单线程版本的C Run—Time库 51 /MLd:选择单线程、Debug版本的C Run—Time库 52 /MT:选择多线程版本的C Run-Time库 53 /MTd:选择多线程、Debug版本的C Run—Time库 54 /nologo:不显示程序的版权信息 55 /O1:优化使产生的可执行代码最小 56 /O2:优化使产生的可执行代码速度最快 57 /Oa:指示编译器程序里没有使用别名,可以提高程序的执行速度 58 /Ob:控制内联(inline)函数的展开 59 /Od:禁止代码优化 60 /Og:使用全局优化 61 /Oi:用内部函数去代替程序里的函数调用,可以使程序运行的更快,但程序的长度变长 62 /Op:提高浮点数比较运算的一致性 63 /Os:产生尽可能小的可执行代码 64 /Ot:产生尽可能块的可执行代码 65 /Ow:指示编译器在函数体内部没有使用别名 66 /Ox:组合了几个优化开关,达到尽可能多的优化 67 /Oy:阻止调用堆栈里创建帧指针 68 /Q1f:对核心级的设备驱动程序生成单独的调试信息 69 /QI0f:对Pentium 0x0f错误指令作修正70 /Qifdiv:对Pentium FDIV错误指令作修正 71 /P:将预处理输出写到指定文件里,文件的后缀名为I 72 /TC:将命令行上的所有文件都当作C源程序编译,不管后缀名是否为.c 73 /Tc:将指定的文件当作C源程序编译,不管后缀名是否为.c 74 /TP:将命令行上的所有文件都当作C++源程序编译,不管后缀名是否为.cpp 75 /Tp:将指定文件当作C++源程序编译,不管后缀名是否为.cpp 76 /U:去掉一个指定的前面定义的符号或常量 77 /u:去掉所有前面定义的符号或常量 78 /V:在编译的obj文件里嵌入版本号 79 /vd:禁止/允许构造函数置换 80 /vmb:选择指针的表示方法,使用这个开关,在声明指向某个类的成员的指针之前,必须先定义这个类 81 /vmg:选择指针的表示方法,使用这个开关,在声明指向某个类的成员的指针之前,不必先定义这个类,但要首先指定这个类是使用何种继承方法 82 /vmm:设置指针的表示方法为Single Inheritance and Multiple Inheritance 83 /vms:设置指针的表示方法为Single Inheritance 84 /vmv:设置指针的表示方法为Any class 85 /W:设置警告等级 86 /w:禁止所有警告 87 /X:阻止编译器搜索标准的include 目录 88 /Yc:创建预编译头文件(pch) 89 /Yd:在所有的obj文件里写上完全的调试信息 90 /Yu:在build过程中使用指定的预编译头文件 91 /YX:指示编译器若预编译头文件存在,则使用它,若不存在,则创建一个 92 /Z7:生成MSC7.0兼容的调试信息 93 /Za:禁止语言扩展(Microsoft Extensions to C 94 /Zd:调试信息只包含外部和全局的符号信息以及行号信息 95 /Ze:允许语言扩展(Microsoft Extensions to C 96 /Zg:为源文件里面定义的每个函数生成函数原型 97 /ZI:生成程序库文件(Pdb)并支持Edit and Continue调试特性 98 /Zi:生成程序库文件(pdb),包含类型信息和符号调试信息 99 /ZL:从obj文件里去掉缺省的库文件名 100 /Zm:设置编译器的内存分配xianzhi 101 /Zn:禁止浏览信息文件里面的封装 102 /Zp:设置结构成员在内存里面的封装格式 103 /Zs:快速检查语法错误-------------------------- vc所支持的文件类型 1 DSW:全称是Developer Studio Workspace,最高级别的配置文件,记录了整个工作空间的配置信息,她是一个纯文本的文件,在vc创建新项目的时候自动生成 2 DSP:全称是Developer Studio Project,也是一个配置文件,不过她记录的是一个项目的所有配置信息,纯文本文件 3 OPT:与DSW、DSP配合使用的配置文件,她记录了与机器硬件有关的信息,同一个项目在不同的机器上的opt文件内容是不同的 4 CLW:记录了跟ClassWizard相关的信息,如果丢失了clw文件,那么在Class View面板里就没有类信息 5 PLG:实际上是一个超文本文件,可以用Internet Explorer打开,记录了Build的过程,是一个日志型文件 6 RC:资源描述文件,记录了所有的资源信息,在资源编辑器里作的修改,实际上都是对RC文件的修改 7 RC2:附加的资源描述文件,不能直接资源编辑器修改,只能手工添加,可以用来添加额外的资源 8 RES:经过资源编辑器编译之后的资源文件,以二进制方式存放 9 SBR:编译器生成的浏览信息文件,在代码导航的时候非常有用,她需要在编译时指定/FR或者/Fr 开关 10 BSC:BSCMAKE.EXE将所有的SBR文件作为输入,经过处理之后输出一个BSC文件,在代码导航的时候实际用到的是BSC文件 11 ILK:当选定渐增型编译连接时,连接器自动生成ILK文件,记录连接信息 12 PDB:全称是Program DataBase,即程序数据库文件,用来记录调试信息,是一个相当重要的文件,没有他,程序无法正常调试 13 LIB:如果项目输出是Dll的话,一般会输出一个跟项目同名的Lib 文件,记录输出的函数信息 14 EXP:同Lib,是跟Dll一起生成的输出文件 15 PCH:全称是PreCompiled Header,就是预先编译好的头文件,在编译时指定/Yu 开关时编译器自动生成 2008-11-14 17:15 CL.exe 是控制 Microsoft C 和 C++ 编译器与链接器的 32 位工具。
Visual Studio 问题集锦
1.#include "stdafx.h"/*是预编译处理器把stdafx.h文件中的内容加载到程序中来。
stdafx.h1名称的英文全称为:Standard Application Fram Extend所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。
这样可以加快编译速度,节省时间。
预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.pch。
编译器通过一个头文件stdafx.h来使用预编译头文件。
stdafx.h这个头文件名是可以在project的编译设置里指定的。
编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx. h"指令,使用projectname.pch编译这条指令之后的所有代码。
因此,所有的MFC实现文件第一条语句都是:#include "stdafx.h"。
2 详细工作原理及作用stdafx.h中没有函数库,只是定义了一些环境参数,使得编译出来的程序能在32位的操作系统环境下运行。
Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。
由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻了。
为避免这种浪费,AppWizard和VisualC++编译程序一起进行工作,如下所示:◎AppWizard建立了文件stdafx.h,该文件包含了所有当前工程文件需要的MFCinclude文件。
且这一文件可以随被选择的选项而变化。
[宝典]VisualC++中fatalerrorC1083的处理办法
Visual C++ 中fatal error C1083的解决办法文/蹇安安最近在做VC开发的过程中遇到了这个烦人的问题,查阅了很多资料也没有一个统一的说法,所以把所有可能出现的情况都总结一下,供以后参考。
症状:fatal error C1083: Cannot open compiler intermediate file:“C:\WINDOWS\Temp\xxxx” No such file or directory或致命错误 C1083:无法打开编译器中间文件:< tmp 目录 >; \ < tmpfile >: 没有的文件或目录原因之一:有可能是环境变量设置不对。
user用户变量和system变量TEMP 和TMP的变量值都为%SystemRoot%\TEMP ,在正常机器上,这是没有问题的,但是有的用户机器的系统盘是手动更改成C盘的,本来应该为E盘。
解决办法:将user用户变量和system变量TEMP和TMP的变量值都改为C:\WINDOWS\Temp原因之二:和预编译头的设置有关。
解决办法:打开Settings对话框,左边的Settings For中选中Release,底下的TreeView中选中StdAfx.cpp,右边选中C/C++标签页,Category选Precompiled Headers,底下选Create precompiled header,Through header 填StdAfx.h。
左边的TreeView中依次选中工程中其他所有的cpp,Precompiled Headers都选中Use precompiled header file,Through header填StdAfx.h。
最后,“OK”、“Rebuild All”。
原因三:该错误是由 TMP 环境变量的末尾分号引起的。
例如:TMP=C:\TMP;解决办法:从命令行设置 TMP 环境变量正确方法是,如下所示:C:\>SET TMP=C:\TMP非常重要的环境字符串不能结束用分号 (;),因为编译器将中间文件名追加到 TMP 路径。
VS2008由于应用程序配置不正确,应用程序未能启动
VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题VC9编译的程序在没有装过VC9(确切的说是.Net Framework3.5)的机器上运行时,如果提示“由于应用程序配置不正确,应用程序未能启动。
重新安装应用程序可能会纠正这个问题。
”这个错误,那么就说明该程序动态链接了VC9的运行时库,(如果还用到了MFC,那么可能动态链接了VC9的MFC库,同理还有ATL 库),以及缺少对应的manifest文件,程序在目标机器上没有找到这些库和配置文件,因此导致了这个错误。
出现这种情况的VC9编译器可能存在3个版本,接下来分别阐明:1、没有打过任何补丁的VS2008该版本对应的CRT/MFC/ATL库的版本号为9.0.21022.8,这个版本号在后面会用到。
这个版本的程序部署比较简单,直接把VC安装目录下的redist目录(C:\Program Files\Microsoft Visual Studio 9.0\VC\redist)中需要的库以及对应的manifest文件拷贝到执行程序同目录下,这样程序到任何机器上都能够正常运行了。
2、打过SP1补丁的VS2008打过该补丁后,系统中存在着两个版本的CRT/MFC/ATL库,版本号分别为9.0.21022.8和9.0.30729.1,这导致了manifest文件中记录的版本号和实际库的版本号不一致(程序要求它们的版本号一致才能运行)。
这个版本的程序部署需要两个步骤,首先要使manifest文件中依赖项的版本号与实际库的版本号一致,均为9.0.30729.1,方法是在工程设置中增加一个宏定义_BIND_TO_CURRENT_VCLIBS_VERSION,该宏定义于C:\Program Files\Microsoft Visual Studio 9.0\VC\include\crtassem.h文件中,然后重新编译程序。
常见编译错误信息
常见编译错误信息A.1 visual c++ 6.0的错误信息概述visual C++ 6.0的编译连接错误信息分为三种类型:致命错误、一般错误和警告。
其中,致命错误是内部编译和连接器出错,一般错误指程序的语法错误,磁盘、文件或内存存取错误或命令行错误等,警告则只指出一些值得怀疑的情况,它并不阻止编译的进行。
Visual C++ 6.0的编译连接错误信息分为下列类型:编译器错误,错误代码 C999-C3999.编译器警告,错误代码C4000-C4999.连接器错误,错误代码LNK1000-LNK2035.连接器警告,错误代码LNK4001-LNK4255.C运行时错误,错误代码R6002-R6035.C运行时警告,错误代码CRT1001.资源编译器错误,错误代码RC1000-RC2236.资源编译器警告,错误代码RC4000-RC4413.资源编译器警告,错误代码RW1004-RW4004.NMAKE错误,错误代码U1000-U4014.ATL提供程序错误和警告,错误代码ATL2004-ATL4111.命令行错误,错误代码D8000-D8046.命令行警告,错误代码D9000-D9044.配置优化错误和警告,错误代码PG0001-PG1087.项目生成错误和警告,错误代码PRJ0002-PRJ0051.CVTRES错误,错误代码CVT1100-CVT4001.BSCMAKE错误,错误代码BK1500-BK4503.表达式计算错误,错误代码CXX0000-CXX0072数学错误,错误代码M6101-M6205.SPROXY错误,错误代码SDL0000-SDL1030.SPROXY警告,错误代码SDL4000-SDL4009.Web部署错误和警告,错误代码VCD0001-VCD0048.XDCMake错误和警告,错误代码VCD0001-VCD0048.其中最常用的是编译器错误和警告。
Visual C++ 6.0的编译连接错误信息数量庞大,而且是英文版的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Visual Studio 2008 常见错误解决之预编译头
今天照着MSDN中的例子写了一个程序,莫名其妙的出现了这样的错误(难道官方的代码也不可靠!?):
warning C4627: “#include <iostream>”: 在查找预编译头使用时跳过
warning C4627: “#include "MathFuncsDll.h"”: 在查找预编译头使用时跳过
fatal error C1010: 在查找预编译头时遇到意外的文件结尾。
是否忘记了向源中添加“#include "stdafx.h"”?
还好,错误提示的比较明显,于是我就仔细看了,大概意思是使用预编译头时出错了。
这好办,打开项目-工程属性(或者直接按Alt+F7)选择“配置属性”- “c/c++ ”-预编译头-选择“不使用预编译头”。
重新生成解决方案,OK成功!
也可以根据,最后一条提示“ fatal error C1010: 在查找预编译头时遇到意外的文件结尾。
是否忘记了向源中添加“#include "stdafx.h"”?”在原文件开头添加#include "stdafx.h" 解决这个问题!
为什么需要预编译头文件?
一言以蔽之:提高编译速度.一般地,编译器以文件为单位编译。
如果修改了一工程中的一个文件则所有文件都要重新编译,包括头文件里的所有东西(eg.Macro 宏,Preprocessor预处理),而VC程序中,这些头文件中所包括的东西往往是非常大的,编译之将占很长的时间。
但它们又不常被修改,是较稳定的,为单独的一个小文件而重新编译整个工程的所有文件导致编译效率下降,因此引入了.PCH 文件。
如何使用预编译头文件以提高编译速度?
要使用预编译头文件,必须指定一个头文件(.H),它包含我们不会经常修改的代码和其他的头文件,然后用这个头文件来生成一个预编译头文件(.PCH),VC默认的头文件就是StdAfx.h,因为头文件是不能编译的,所以我们还需要一个.CPP 文件来作桥梁,VC默认的文件为StdAfx.cpp,这个文件里只有一句代码就是:#include "StdAfx.h"。
接下来要用它生成.PCH文件,涉及到几个重要的预编译指令:/Yu,/Yc,/Yx,/Fp。
简单地说,/Yc是用来生成.PCH文件的编译开关。
在Project->setting->C/C++的Category里的Precompiled Header,然后在左边的树形视图中选择用来编译生成.PCH文件的.CPP文件(默认即StdAfx.cpp),你就可以看到/Yc这个开关,它表示这个文件编译了以后是否生成.PCH文件(可能/Yc的c表示create)。
/Fp指令指定生成的.PCH文件的名字及路径(可能/Fp的p代表path)。
/Yu的u即use,工程中只要包括了.H文件的文件都会有这个/Yu 指令。
如果选择自动Automatic...的话则原来为/Yc的地方就换成了/Yx指令。
如果选择自动,则每次编译时编译器会看以前有没有生成过.PCH文件,有则不现生成否则就再次编译产生.PCH文件。
注意:
A,实际上,由Appzard项目向导生成的默认的头文件及CPP文件StdAfx.h和StdAfx.cpp可以是任何名字的.原因很简单。
但如果你要这样做就要记得修改相应的Project->setting...下的几个预编译指(/Yc,/Yu,/Yx,/Fp)的参数。
B.在任何一个包括了将要预编译的头文件而使用了.PCH文件的工程文件的开头,一定必须要是在最开头,你要包含那个指定生成.PCH文件的.H文件(通
过.CPP文件包括,默认为StdAfx.cpp),如果没包括将产生我最开头产生的错误.如果不是在最开头包括将产生让你意想不到的莫名其妙错误,如若不信,盍为试之?
C.预编译文件.PCH生成之很耗时间,而且生成之后它也很占磁盘空间,常在
5-6M,注意项目完成之后及时清理无用的.PCH文件以节约磁盘空间。
D.如果丢了或删了.PCH文件而以后要再修改工程文件时,可将指定的/Yc的.CPP 文件(默认为StdAfx.cpp)重新编译一次即可再次生成.PCH文件,不用傻傻的按F7或Rebuild All。