VC编译错误处理
VC編譯錯誤處理
1. 使用VC2008調試時彈出沒有找到mfc90ud.dll,因此這個應用程序未能啟動.重新安裝應用程序可能會修復此
方法: 項目屬性->配置屬性->鏈接器->調試->生成映射文件 選擇 Yes (/MAP)
2. error C2471: 無法更新程序數據庫“d:\Work\ Project\FBReader\debug\vc90.pdb”
解決方案:修改項目屬性 右擊項目 --> "屬性”
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,無法切換編碼。經過網上查找資料,找到解決方案:將<?xml version="1.0" encoding="utf-8"?>去掉后即可插入
直接刪掉第一行
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。
總結
- 上一篇: Python数据库使用MySQL
- 下一篇: C++实现静态顺序表的增删查改以及初始化