现在的位置: 首页 > 综合 > 正文

一万零一个错误

2013年10月09日 ⁄ 综合 ⁄ 共 3503字 ⁄ 字号 评论关闭

编译过程中会遇到的错误以及解决方案

错误1:

 

错误提示:

 error LNK2001: unresolved external symbol "unsigned int (__stdcall* ATL::g_pfnGetThreadACP)(void)" (?g_pfnGetThreadACP@ATL@@3P6GIXZA)

 

解决办法:添加#include <atlbase.h>这句话就行了

 

 

 错误2:

 

 错误提示:fatal error C1853: 'Release/BankSave.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)

 

解决办法:这是典型的语言混合编程中出现的错误

当 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. 常常让人摸不着头脑。应该说,在新版中的这个提示是有所改进的。不过在网上搜索一番,对这个问题往往都是建议对整个项目取消预编译头的设置。这显然不是一个好的解决方案。对于一个比较大的工程来说,使用预编译头可以使总的编译时间大大减少。因而保留预编译头的设置才是比较好的解决方案。搜索 MSDN,针对不同的情况,可以有不同的解决方案:

:适用于绝大多数文件是 .cpp 或绝大多数文件是.c的情况。在这种情况下,将少数的不同类文件设为不使用预编译头是比较平衡的做法,方法是:对于 VC++6.0,在 FileView 里对要取消预编译头的 .c (或 .cpp) 文件点右键,选择 settings,在弹出的对话框右边选择 category 为 precompiled headers,再设置选项为 not using ...;对于 VS2005,则在 solution explorer 中对相应文件点右键选择 properties,在 precompiled headers 项下设置 not using... 即可。如果需要设置多个文件,则可以按住 Ctrl 键再同时选中这些文件并设置

:如果受影响的文件比较多,则把它们都设置禁止预编译头的话仍然会使项目总体的编译速度大大降低,得不偿失。这时考虑可以为这组文件建立专用的预编译头。在 VC++ 极早期版本(1.5及以前版本)中是支持单个工程中建立分别针对 .c 和 .cpp 的预编译头的,但之后的版本中只支持单独的预编译头。在这种情况下,我们可以在workspace(或 solution)中建立一个新的静态链接库 (Static Library) 工程,将所有的 .c 文件独立出来加入到该工程中单独编译,这样就可以在该静态链接库中针对 .c 文件创建预编译头。但是这样做在一定程度上需要被独立出来的代码在逻辑上是属于同一模块中的,这样才便于维护。不过从设计的角度来说,这个要求一般是满足的,否则就应考虑下项目的总体设计了:P 最后别忘了设置原项目的依赖项 (dependency) 为独立出来的这个静态库项目。

 

错误3:

 

 错误提示:No certificates were found that met all the given criteria.

 

解决办法:这是签名错误,修改的办法:在工程属性的最后一个即签名上面选择不需要签名。这样就可以编译过去。

 

 

错误4:

错误现象:VS2005中的Find In Files对话框无法打开

解决办法:法使开始->所有程序->Microsoft Visual Stdio 2005->Visual Studio Tools->Visual Studio 2005 Command Prompt 打开运行。然后开始输入devenv/ResetSettings运行。注意在进行整个操作之前需要将VS2005程序关闭。如果一次操作没有效果,那么多进行几次就可以了。我自己的就是运行了三遍才有用的。(按照理论一次就可以通过)。这是我参考别人在论坛上的回答,具体可以参考以下网址,要求有英语基础,否则别去。http://social.msdn.microsoft.com/Forums/en-US/vssetup/thread/a9ace617-d957-475f-8d4b-5d9e51402802



错误5:

PoomCalendar.obj : error LNK2001: unresolved external symbol __GSHandlerCheck
PoomMaster.obj : error LNK2001: unresolved external symbol __GSHandlerCheck

说明:

 


If you're a native C++ smart device developer and recently downloaded VS2005 SP1 you may find that some of your existing programs and some of the samples that ship with Windows Mobile SDK will fail to compile. Even if you're able to make them compile they may issue a warning like "warning LNK 4099: PDB 'libbmt.pdb was not found".

This is because VSD has updated the compilers for VS2005 SP1 to be on par with WinCE 6 compilers which included /GS support. So, for projects that don’t include libc/msvcrt or turn off /GS, you will run into these errors on pre-WinCE 6 platforms

As a workaround you should explicitly include "libcmt.lib" in the list of additional libs to link against and turn off the linker warning (/nowarn:4099).

 


错误6:


CVTRES : fatal error CVT1100: duplicate resource. type:ICON, name:1, language:0x0409 LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt

解决方法:

 

在res,也就是资源文件中,倒数第二行,下面这句话注释掉,就可以编译通过了

CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "res//ControlMania1.exe.manifest"

 

说明:错误的原因是因为上面这些资源有双份,导致编译错误。具体的原因请参阅

http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/ca805bad-9893-483b-8482-6e6ccaa0a4f8/

以及微软的http://msdn.microsoft.com/en-us/library/3k67zd6z(VS.80).aspx

这里面就谈到了不同低版本的程序在用高版本的编译器进行编译的时候可能产生的错误。

 

抱歉!评论已关闭.