error LNK2001: unresolved external symbol __imp

學習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 external on _WinMain@16」的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錯誤雖然比較困難,可是隻要注意到了上述問題,仍是能 夠避免和予以解決的。  
相關文章
相關標籤/搜索