天天看點

error LNK2001: unresolved external symbol

usesax.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall MySAX2Handler::startElement(unsigned short const * const,unsigned short const * const,unsigned short const * const,class xercesc_2_8::Attributes const &)" (?star

[email protected]@@[email protected][email protected]@@Z)

usesax.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall MySAX2Handler::endElement(unsigned short const * const,unsigned short const * const,unsigned short const * const)" ([email protected]@@[email protected])

usesax.obj : error LNK2001: unresolved external symbol "void __cdecl printDTD(void)" ([email protected]@YAXXZ)

..\..\bin/dtd.exe : fatal error LNK1120: 3 unresolved externals

偶是忘記加一個頭檔案了。偶在一個頭檔案裡面寫了函數定義,然後在别一頭檔案裡面寫函數實作,結果隻加有函數定義的頭檔案就出現上面的錯誤,都加上去了就沒有錯誤了。。。

網上查到的:

學習VC++時經常會遇到連結錯誤LNK2001,該錯誤非常讨厭,因為對于程式設計者來說,最好改的錯誤莫過于編譯錯誤,而一般說來發生連接配接錯誤時,編譯都已認證。産生連接配接錯誤的原因非常多,尤其LNK2001錯誤,常常使人不明其是以然。如果不深入地學習和了解VC++,要想改正連接配接錯誤LNK2001非常困難。

初學者在學習VC++的過程中,遇到的LNK2001錯誤的錯誤消息主要為:

  unresolved external symbol “symbol”(不确定的外部“符号”)

如果連接配接程式不能在所有的庫和目标檔案内找到所引用的函數、變量或标簽,将産生此錯誤消息。一般來說,發生錯誤的原因有兩個:

一是所引用的函數、變量不存在、拼寫不正确或者使用錯誤;

二是可能使用了不同版本的連接配接庫;

  以下是可能産生LNK2001錯誤的原因:

  一.由于編碼錯誤導緻的LNK2001。

  1.不相比對的程式代碼或子產品定義(.DEF)檔案能導緻LNK2001。例如,如果在C++ 源檔案内聲明了一變量“var1”,卻試圖在另一檔案内以變量“VAR1”通路該變量,将發生該錯誤。

  2.如果使用的内聯函數是在.CPP檔案内定義的,而不是在頭檔案内定義将導緻LNK2001錯誤。

  3.調用函數時如果所用的參數類型同函數聲明時的類型不符将會産生LNK2001。

  4.試圖從基類的構造函數或析構函數中調用虛拟函數時将會導緻LNK2001。

  5.要注意函數和變量的可公用性,隻有全局變量、函數是可公用的。靜态函數和靜态變量具有相同的使用範圍限制。當試圖從檔案外部通路任何沒有在該檔案内聲明的靜态變量時将導緻編譯錯誤或LNK2001。

  函數内聲明的變量(局部變量) 隻能在該函數的範圍内使用。

  C++ 的全局常量隻有靜态連接配接性能。這不同于C,如果試圖在C++的多個檔案内使用全局變量也會産生LNK2001錯誤。一種解決的方法是需要時在頭檔案中加入該常量的初始化代碼,并在.CPP檔案中包含該頭檔案;另一種方法是使用時給該變量賦以常數。

  二.由于編譯和連結的設定而造成的LNK2001

  1.如果編譯時使用的是/NOD(/NODEFAULTLIB)選項,程式所需要的運作庫和MFC庫在連接配接時由編譯器寫入目标檔案子產品, 但除非在檔案中明确包含這些庫名,否則這些庫不會被連結進工程檔案。在這種情況下使用/NOD将導緻錯誤LNK2001。

  2.如果沒有為wWinMainCRTStartup設定程式入口,在使用Unicode和MFC時将得到“unresolved externalon [email protected]”的LNK2001錯誤資訊。

  3.使用/MD選項編譯時,既然所有的運作庫都被保留在動态連結庫之内,源檔案中對“func”的引用,在目标檔案裡即對“__imp__func” 的引用。如果試圖使用靜态庫LIBC.LIB或LIBCMT.LIB進行連接配接,将在__imp__func上發

生LNK2001;如果不使用/MD選項編譯,在使用MSVCxx.LIB連接配接時也會發生LNK2001。

  4.使用/ML選項編譯時,如用LIBCMT.LIB連結會在_errno上發生LNK2001。

  5.當編譯調試版的應用程式時,如果采用發行版模态庫進行連接配接也會産生LNK2001;同樣,使用調試版模态庫連接配接發行版應用程式時也會産生相同的問題。

  6.不同版本的庫和編譯器的混合使用也能産生問題,因為新版的庫裡可能包含早先的版本沒有的符号和說明。

  7.在不同的子產品使用内聯和非内聯的編譯選項能夠導緻LNK2001。如果建立C++庫時打開了函數内聯(/Ob1或/Ob2),但是在描述該函數的相應頭檔案裡卻關閉了函數内聯(沒有inline關鍵字),這時将得到該錯誤資訊。為避免該問題的發生,應該在相應的頭檔案中用inline關鍵字标志内聯函數。

  8.不正确的/SUBSYSTEM或/ENTRY設定也能導緻LNK2001。

  其實,産生LNK2001的原因還有很多,以上的原因隻是一部分而已,對初學者來說這些就夠了解一陣子了。但是,分析錯誤原因的目的是為了避免錯誤的發生。LNK2001錯誤雖然比較困難,但是隻要注意到了上述問題,還是能夠避免和予以解決的。

還有:

解決外部符号錯誤:_main,[email protected],__beginthreadex )

在建立MFC項目時, 不使用MFC AppWizard向導, 如果沒有設定好項目參數,就會在編譯時産生很多連接配接錯誤, 如error LNK2001錯誤, 典型的錯誤提示有:  

libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main  

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol [email protected]  

msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol [email protected]  

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex  

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex n  

1. Windows子系統設定錯誤, 提示:  

libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main  

Windows項目要使用Windows子系統, 而不是Console, 可以這樣設定:  

[Project] --> [Settings] --> 選擇"Link"屬性頁,

在Project Options中将/subsystem:console改成/subsystem:windows   

2. Console子系統設定錯誤, 提示:

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol [email protected]

控制台項目要使用Console子系統, 而不是Windows, 設定:  

[Project] --> [Settings] --> 選擇"Link"屬性頁,  

在Project Options中将/subsystem:windows改成/subsystem:console  

3. 程式入口設定錯誤, 提示:  

msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol [email protected] 

通常, MFC項目的程式入口函數是WinMain, 如果編譯項目的Unicode版本, 程式入口必須改為wWinMainCRTStartup, 是以需要重新設定程式入口:

[Project] --> [Settings] --> 選擇"Link"屬性頁,

在Category中選擇Output,

再在Entry-point symbol中填入wWinMainCRTStartup, 即可

4. 線程運作時庫設定錯誤, 提示: @: kAF n

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex

這是因為MFC要使用多線程時庫, 需要更改設定:

[Project] --> [Settings] --> 選擇"C/C++"屬性頁, ')

在Category中選擇Code Generation,

再在Use run-time library中選擇Debug Multithreaded或者multithreaded

鹹魚遊俠(75374355) 12:11:11

其中,

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版本: 調試階段使用