VC编译错误处理

1. 使用VC2008调试时弹出没有找到mfc90ud.dll,因此这个应用程序未能启动.重新安装应用程序可能会修复此

方法: 项目属性->配置属性->链接器->调试->生成映射文件 选择 Yes (/MAP)


2. error C2471: 无法更新程序数据库“d:\Work\ Project\FBReader\debug\vc90.pdb”

解决方案:修改项目属性 右击项目 --> "属性”

1. “C/C++” --> "常规” -->”调试信息格式” 设置为 “C7 兼容(/Z7)”

2. “C/C++” --> "代码生成” -->”启用字符串池” 设置为 “是(/GF)”

3. “链接器” --> "调试” -->”生成调试信息” 设置为 “是(/DEBUG)”


3. error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup

Go to "Linker settings -> System". Change the field "Subsystem" from "Windows" to "Console". Done.


4. CVTRES : fatal error CVT1100: duplicate resource. type:MANIFEST, name:1, language:0x0409【错误解决方法】

描述:Visual Studio 2003.NET转化为2005时所遇到的错误使得无法运行。

解决:找到解决方案下的rc文件,用记事本打开,注释掉含有manifest所在行,重新编译即可。

如://1                       RT_MANIFEST             "SimpleSample.manifest"


5. 错误提示:XML 分析: 行 1,字符 38,无法切换编码 .

需要把xml存入数据库,在数据库中建立了xml类型的列后,使用程序将xml作为参数存入库时,出现了错误:XML 分析: 行 1,字符 38,无法切换编码。经过网上查找资料,找到解决方案:将去掉后即可插入

直接删掉第一行


6. error LNK2026: module unsafe for SAFESEH image.

Linker->Advanced->Image has safe exception handlers:改为No(/SAFESEH:NO)


7. 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用(转)

LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用 MSVCRTD.lib test

参考了以下方法

以下为转载

一,问题描述

error LNK2001: unresolved external symbol _WinMain@16

debug/main.exe:fatal error LNK 1120:1 unresolved externals

error executing link.exe;

二,产生这个问题可能的原因

1, 你用vc建了一个控制台程序,它的入口函数应该是main, 而你使用了WinMain.

2.  你用vc打开了一个.c/.cpp 文件,然后直接编译这个文件,这个文件中使用了WinMian而不是main作为入口函数。vc这时的默认设置是针对控制台程序的。

三, 解决方法

1.进入project->setting->c/c++, 在category中选择preprocessor,在processor definitions中删除_CONSOLE, 添加_WINDOWS

2.进入project->setting->Link, 在Project options中将 /subsystem:console改为/subsystem:windows.

3.保存设置,Rebuild All.

VS2005中的设置请参考对应项进行设置

四,VS2005中的设置

1.菜单中选择 Project->Properties, 弹出Property Pages窗口

2.在左边栏中依次选择:Configuration Properties->C/C++->Preprocessor,然后在右边栏的Preprocessor Definitions对应的项中删除_CONSOLE, 添加_WINDOWS.

3.在左边栏中依次选择:Configuration Properties->Linker->System,然后在右边栏的SubSystem对应的项改为Windows(/SUBSYSTEM:WINDOWS)

4.Rebuild All. Ok ?


8. error C3389:__declspec(dllexport) 不能与 /clr:pure 或 /clr:safe 一起使用

  解决方法:

  1、菜单“项目”--〉“XXXX属性”

  2、“配置属性”--〉“常规”---〉“公共语言运行库支持”

  3、系统默认“纯 MSIL 公共语言运行库支持(/clr:pure)”改为“公共语言运行库支持(/clr)”或“公共语言运行库支持,原来的语法 (/clr:oldSyntax)”选项即可


9. 使用vs2008编译c文件时,可能遇到出现 inline”之后应输入“(”错误!

解决方案是:在该头文件中加入

#if defined(WIN32) && !defined(__cplusplus)

#define inline __inline

#endif


10. This function or variable may be unsafe

在该文件上右击,在 processor 中添加 _CRT_SECURE_NO_WARNINGS


11. Building an MFC project for a non-Unicode character set is deprecated

下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=40770


12. error C2054: expected '(' to follow 'inline'  

不用改代码,直接改project->[setting]->[c/c++]->Preprocessor definitions:编辑框里输入inline=__inline即可。


13. LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

错误描述:

1>正在编译资源...

1>正在编译资源清单...

1>正在链接...

1>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

1>生成日志保存在“file://E:\HelloC\ShapeFill V11\ShapeFill\Debug\ShapeFill.log”

1>ShapeFill- 1个错误,0个警告

========== 全部重新生成: 0 已成功, 1 已失败, 0 已跳过 ==========

解决方案:

 第一步:将 项目——项目属性——配置属性——连接器——清单文件——嵌入清单 “是”改为“否”。若还不能解决问题进入第二步。

第二步:查看计算机是否为64bit操作系统,如是,继续如下操作。

查找是否有两个cvtres.exe。

C:\Program Files(x86)\Microsoft Visual Studio 10.0\vc\bin\cvtres.exe

C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe

右键属性—详细信息, 查看两者版本号,删除/重命名较旧的版本,或者重新设置Path变量。


治本的办法是第二步,删除旧版本的cvtres.exe后,就不需要每次都设置配置了。

14. fatal error C1189: #error : The C++ Standard Library forbids macroizing keywords. Enable warning C4005 to find the forbidden macro.

最近在使用 VS2015 编译以前用VS2008的项目的时候,提示错误:fatal error C1189: #error :  The C++ Standard Library forbids macroizing keywords. Enable warning C4005 to find the forbidden macro.

解决方法:在项目的“预处理器定义”中增加 "_XKEYCHECK_H"


15. CVTRES : fatal error CVT1100: 资源重复。类型: MANIFEST,名称: 1,语言: 0x0409

LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

fatal error CVT1100: 重复的资源。type:MANIFEST, name:1, language:0x0409 CVTRES 

在资源视图中删除RT_MANIFEST资源。

项目——属性——清单工具,嵌入清单——否


16. error MSB8020: The build tools for Visual Studio 2010 (Platform Toolset = 'v100') cannot be found. To build using the v100 build tools, please install Visual Studio 2010 build tools.  Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Upgrade Solution...".    C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.Cpp.Platform.targets    64    5    TerrainDemo

error msb8020 :the builds tools for...

也就是 VS2013 去编译 VS2010 

右击工程,提升工程


17. error RC2108: expected numerical dialog constant

PictureControl 需要显示图片,则需要把 Type 改成 Bitmap

CONTROL         "",IDC_VIDEOTHUMB,27,103,11,9,NOT WS_GROUP

改成:

CONTROL         "",IDC_VIDEOTHUMB,"STATIC", SS_BITMAP, 27,103,11,9,NOT WS_GROUP


18. RC 在另一个文件中打开

在 VC 中关闭所有的页面


19. error LNK2026: 模块对于 SAFESEH 映像是不安全的

解决方法:

1.打开该项目的“属性页”对话框。

2.单击“链接器”文件夹。

3.单击“命令行”属性页。

4.将 /SAFESEH:NO 键入“附加选项”框中,然后点击应用。


20. VS2010 解决链接错误:error LNK2019: 无法解析的外部符号 __iob  

该错误主要是由于静态库在VC6编译而主程序在VC2010编译,大家用的CRT不同。解决办法,代码中增加

#ifdef __cplusplus

extern "C" 

#endif

FILE _iob[3] = {__iob_func()[0], __iob_func()[1], __iob_func()[2]};

此错误的产生根源:

在VC6的stdio.h之中有如下定义

_CRTIMP extern FILE _iob[];

#define stdin (&_iob[0])

#define stdout (&_iob[1])

#define stderr (&_iob[2])

stdin、stdout、stderr是通过查_iob数组得到的。所以,VC6编译的程序、静态库只要用到了printf、scanf之类的函数,都要链接_iob数组。

而在vc2010中,stdio.h中变成了

_CRTIMP FILE * __cdecl __iob_func(void);

#define stdin (&__iob_func()[0])

#define stdout (&__iob_func()[1])

#define stderr (&__iob_func()[2])

_iob数组不再是显式的暴露出来了,需要调用__iob_func()函数获得。所以vc6的静态库链接VC2010的C运行库就会找不到_iob数组.

通过重新定义

FILE _iob[3] = {__iob_func()[0], __iob_func()[1], __iob_func()[2]};

就把vc6需要用到的_iob数组搞出来了


21. 创建其他对象所用编译器旧的编译器创建的;请重新生成旧的对象和库-问题解决

解决办法:Release模式下->属性->常规->项目默认值->全程序优化  将这里的默认项 “使用链接时间代码生成”改为“无全程序优化,  接下来就可以运行了。 


22. 默认库“msvcrtd.lib”与其他库的使用冲突;请使用 /NODEFAULTLIB:library

警告信息如下:

1>LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library

原因:

在使用多线程调试dll(MDd)模式的时候 <位置:配置属性 - c/c++ - 代码生成-运行时库>

msvcrtd.lib 与 ibcmt.lib产生冲突

解决方法有2个:

1.右击工程 - 属性 ”配置属性 - 链接器 - 输入 - 忽略特定库“,添加 ”libcmt.lib“

2.右击工程 - 属性 ”配置属性 - 链接器 - 命令行” 添加:  /NODEFAULTLIB:"libcmt.lib"


23. error C1128: 节数超过对象文件格式限制: 请使用 /bigobj 进行编译

单击“C/C++”项。

单击“命令行”属性页。

在“附加选项”框中键入编译器选项,添加/bigobj。

你可能感兴趣的:(VC编译错误处理)