VC下編譯和連結常出現的問題匯總

來源:互聯網
上載者:User

Loaded 'C:/PWIN9/SYSTEM/WININET.DLL', no matching symbolic information found

[說明]

在debug下出現的調試資訊

[原因]

這是正常的,並不是說你的程式有什麼錯誤。在Debug時,VC在調用程式用到的每個DLL時會檢查它是否包括調試資訊。如果包括調試資訊,在調試時可以利用,就是說可以單步跟蹤進去。但是象WININET.DLL這樣的系統DLL是不包括調試資訊的,所以會有如上資訊,這不會產生什麼不利影響,當然你無法對WININET.DLL這樣的系統DLL進行來源程式調試

 

VC下fatal error LNK1202錯誤的解決方案

[說明]

fatal error LNK1202: "E:/bak-1128/Debug/vc60.pdb" is missing debugging information for referencing module
Error executing link.exe.

這種連結錯誤一般出現在DEBUG編譯中,而在Release編譯中正常編譯,而且往往是因為使用了靜態庫檔案(尾碼名為.lib的檔案)

[原因]

"filename" missing debugging information for referencing module

The given program database (PDB) for an object file was invalid. Recompile the object file; use CL's /Zi option.

也就是沒有在設定中加入Zi選項

當我們使用沒有經過這種設定方式產生的lib檔案,而我們的主工程中又設定了/Zi或/ZI選項,所以就產生了以上的錯誤。

[解決方案]

一種方法在設定中去掉 generate   debug   info 選項,但這樣可能就無法調試了  
另一種方法是重新編譯lib這幾個庫,編譯時間加入/Zi 或/ZI 操作(如果這些庫不是我們自己的,那就麻煩了)
vc6下是Project Setting->C++標籤->debug info下選擇Program Database for edit and continue或Program Database
還有一種方法是找.lib這幾個庫的debug版

 

如何與C語言產生的.obj聯編

  把obj拷入debug檔案夾,然後在檔案頭部加入一句: 
  #pragma  comment(lib,"debug/YourObjName.obj") 

 

Visual C++ 中以錯誤的順序連結 CRT 庫和 MFC 庫時出現 LNK2005 錯誤

[說明]
當 C 運行時 (CRT) 庫和 Microsoft 基礎類 (MFC) 庫的連結順序有誤時,可能會出現以下 LNK2005 錯誤之一:
nafxcwd.lib(afxmem.obj) :error LNK2005:
"void * __cdecl operator new(unsigned int)"(??2@YAPAXI@Z) already
defined in LIBCMTD.lib(new.obj)
nafxcwd.lib(afxmem.obj) :error LNK2005:
"void __cdecl operator delete(void *)"(??3@YAXPAX@Z) already defined
in LIBCMTD.lib(dbgnew.obj)
nafxcwd.lib(afxmem.obj) :error LNK2005:
"void * __cdecl operator new(unsigned int,int,char const *,int)"
(??2@YAPAXIHPBDH@Z) already defined in LIBCMTD.lib(dbgnew.obj)
mfcs40d.lib(dllmodul.obj):error LNK2005:_DllMain@12 already defined in
MSVCRTD.LIB (dllmain.obj)
mfcs42d.lib(dllmodul.obj):error LNK2005:_DllMain@12 already defined in
msvcrtd.lib(dllmain.obj)
 

原因

< type=text/javascript>loadTOCNode(1, 'cause');
CRT 庫對 new、delete 和 DllMain 函數使用弱外部連結。MFC 庫也包含 new、delete 和 DllMain 函數。這些函數要求先連結 MFC 庫,然後再連結 CRT 庫。
 
解決方案
< type=text/javascript>loadTOCNode(1, 'resolution');
該問題有兩種解決方案。第一種方法是強制連結器按照正確的順序連結庫。第二種方法是由您親自尋找導致問題的模組並糾正它。

注意:下列步驟是基於 Visual C++ 6.0 的。
解決方案一:強制連結器按照正確的順序連結庫
< type=text/javascript>loadTOCNode(2, 'resolution'); 1. 在“項目”菜單上,單擊“設定”。
2. 在“項目設定”對話方塊的“以下項目的設定”視圖中,單擊以選中出現連結錯誤的項目配置。
3. 在“連結”選項卡上,單擊以選中“類別”組合框中的“輸入”。
4. 在“忽略庫”框中,插入庫名(例如,Nafxcwd.lib;Libcmtd.lib)。

注意:等效的連結器命令列是:/NOD:<library name>。
5. 在“對象/庫模組”框中,插入庫名。必須確保這些庫按順序列出,而且是行中的前兩個庫(例如,Nafxcwd.lib 和 Libcmtd.lib)。
要在 Visual C++ .NET 中設定該選項,請閱讀“設定 Visual C++ 項目屬性”線上說明主題。
解決方案二:找到並糾正出現問題的模組
< type=text/javascript>loadTOCNode(2, 'resolution'); 要查看當前的庫連結順序,請按照下列步驟操作: 1. 在“項目”菜單上,單擊“設定”。
2. 在“項目設定”對話方塊的“以下項目的設定”視圖中,單擊以選中出現連結錯誤的項目配置。
3. 在“連結”選項卡上的“項目選項”框中鍵入 /verbose:lib。
4. 重建項目。在連結過程中,這些庫將在輸出視窗中列出。

 
 

更多資訊

< type=text/javascript>loadTOCNode(1, 'moreinformation');
使用 MFC 庫時,務必先連結它們,然後再連結 CRT 庫。這可以通過確保項目中的每個檔案都首先包含 Msdev/Mfc/Include/Afx.h 來完成。直接包含 (#include <Afx.h>) 或間接包含 (#include <Stdafx.h>) 都可以。Afx.h 包含檔案會通過使用 #pragma comment (lib,"<libname>") 指令來強制採用庫的正確順序。

如果源檔案的副檔名為 .c,或者該檔案的副檔名為 .cpp 但不使用 MFC,則可以建立一個較小的標頭檔 (Forcelib.h) 並將其放在模組的頂端。這個新的標頭檔可確保按照正確的順序搜尋庫。

Visual C++ 不包含該標頭檔。要建立此檔案,請按照下列步驟操作: 1. 開啟 Msdev/Mfc/Include/Afx.h。
2. 選定 #ifndef _AFX_NOFORCE_LIBS 和 #endif //!_AFX_NOFORCE_LIBS 之間的行。
3. 將選定部分複製到 Windows 剪貼簿。
4. 建立一個新文字檔。
5. 將剪貼簿的內容粘貼到這個新檔案中。 
6. 將該檔案另存新檔 Msdev/Mfc/Include/Forcelib.h。

 

在 Visual C++ .NET 中重現問題的步驟
< type=text/javascript>loadTOCNode(2, 'moreinformation'); 1. 啟動 Microsoft Visual Studio .NET。
2. 在[檔案] 功能表上,指向“建立”,然後單擊“項目”。
3. 單擊“項目類型”下的“Visual C++ 項目”,然後單擊“模板”下的“MFC 應用程式”。
4. 在“名稱”文字框中,鍵入 Q148652。
5. 在“位置”文字框中,鍵入 C:/Test,然後單擊“確定”。
6. 在“MFC 應用程式嚮導”對話方塊中,單擊“應用程式類型”。
7. 單擊“應用程式類型”下的“基於對話方塊”,然後單擊“MFC 的使用”下的“在靜態庫中使用 MFC”。
8. 單擊“完成”。
9. 在“方案總管”中,選擇“源檔案”下的全部三個 .cpp 檔案。
10. 按右鍵三個選定的檔案,然後單擊“刪除”。
11. 按右鍵“源檔案”,指向“添加”,然後單擊“添加新項”。
12. 單擊“模板”下的“C++ 檔案”。在“名稱”文字框中,鍵入 Aa。單擊“開啟”。
13. 將以下代碼粘貼到 Aa.cpp 中:
int test(){new int; return 1;}
14. 按右鍵“源檔案”,指向“添加”,然後單擊“添加現有項”。 
15. 選擇以下檔案: • Q148652.cpp
• Q148652Dlg.cpp
• stdafx.cpp
 
16. 單擊“開啟”。
17. 您在第 15 步中選擇的檔案將出現在“源檔案”下。
18. 選擇“源檔案”下的全部四個 .cpp 檔案。
19. 按右鍵選定的四個 .cpp 檔案,然後單擊“屬性”。
20. 展開“配置屬性”,然後展開“C/C++”。
21. 單擊“先行編譯頭”。
22. 將“建立/使用先行編譯頭”屬性設定為“不使用先行編譯頭”。單擊“確定”。
23. 在“產生”菜單上,單擊“重建解決方案”。

出處:http://blog.csdn.net/jia_xiaoxin/archive/2008/09/04/2880073.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.