1. 程式人生 > >Visual Studio Error LNK2001 無法解析的外部符號 的幾種情況

Visual Studio Error LNK2001 無法解析的外部符號 的幾種情況

        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   [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。  

相關推薦

Visual Studio Error LNK2001 無法解析外部符號情況

        VC++時經常會遇到連結錯誤LNK2001,該錯誤非常討厭,因為對於程式設計者來說,最好改的錯誤莫過於編譯錯誤,而一般說來發生連線錯誤時,編譯都已通過。產生連線錯誤的原因非常多,尤其LNK2001錯誤,常常使人不明其所以然。如果不深入地學習和理解VC+

Visual Studio error LNK2019: 無法解析外部符號

Visual Studio開發中引用第三方的庫時,可能會遇到Error LNK 2019,這是由於庫引用不正確導致的。本文針對引用.h 標頭檔案和.lib庫檔案遇到error LNK2019 的情況。 第一步,新增.h到專案的包含目錄。 右鍵點選開發專案->屬性-&

Error LNK2001 無法解析外部符號情況及解決

VC++時經常會遇到連結錯誤LNK2001,該錯誤非常討厭,因為對於程式設計者來說,最好改的錯誤莫過於編譯錯誤,而一般說來發生連線錯誤時,編譯都已通過。產生連線錯誤的原因非常多,尤其LNK2001錯誤,常常使人不明其所以然。如果不深入地學習和理解VC++,要想改正連線錯誤LNK2001非常困難。 &

"error LNK2001: 無法解析外部符號 _sscanf " 問題 解決方法

問題場景: 使用VS2015的軟體開發環境中,在引用第三方檔案庫時,出現了 “libx264.a(ratecontrol.o) : error LNK2019: 無法解析的外部符號 _sscanf,該符號在函式 _x264_ratecontrol_new 中被引用” 等錯誤

C++工程編譯之“error LNK2001: 無法解析外部符號

今天一整天都在折騰“error LNK2001: 無法解析的外部符號”,就在頭疼不已的時候,總算是找到問題原因了:各個動態連結庫的編譯方式必須統一才行,要不然很容易對庫函式的引用產生衝突。簡單來說就是,如果使用的第三方函式庫編譯方式採用/MD,那麼主工程也應該

error LNK2001: 無法解析外部符號 "public: virtual struct QMetaObject const * __thiscall Widget::metaObject

其原因是系統無法訪問到Moc檔案。解決方案如下: 專案–>右鍵點選–>Qt Project Settings 檢查你的 MocDirectory 其值是否是 .\Generat

VS2013執行錯誤:error LNK2001: 無法解析外部符號

1>Goods.obj: error LNK2001:無法解析的外部符號 "int (* arr)[20]" ([email protected]@[email protected]) 1>Connect.obj: error LNK2001

error LNK2001: 無法解析外部符號 fatal error LNK1120: 1 個無法解析外部命令(呼叫約定的問題)

問題背景: 我在用MFC寫的一個單文件的程式呼叫以MFC通過.def模組匯出的DLL時出現瞭如下錯誤  error LNK2001: 無法解析的外部符號 "unsigned short __cdecl SearchCtrl(struct tagPARAMS &,sh

ogre-procedural library building error LNK2001: 無法解析外部符號

在編譯ogre-procedural的lib時出現了很多錯誤,修改之後沒有報錯了 但是又出現如下問題:1>     正在建立庫 D:\Ogre\OgreAddOn\ogre-procedural\lib\Debug\OgreProcedural_d.lib 和物件 D:

vc2008 錯誤:error LNK2001: 無法解析外部符號之一

error LNK2001: 無法解析的外部符號   "protected: virtual struct AFX_MSGMAP const * __thiscall ****::GetMessageMap(void)const " ([email protect

error lnk2001無法解析外部符號_main 無法解析外部符號[email 

這個問題表明你新建的是一個main型別函式(控制檯程式),而你的程式中有視窗程式,顯然是個win32函式,解決方法:專案-屬性-連結器-系統-子系統-把控制檯該為windows剛學WinAPI編譯遇到不少問題,LNK2019: 無法解析的外部符號 _main,該符號在函式 ___tmainCRTStartup

關於 error LNK2001: 無法解析外部符號 ___wargv問題

筆者用VS2010生成64位的MFC應用程式時發現,輸出中提示 1> uafxcwd.lib(appcore.obj) : error LNK2001: 無法解析的外部符號 ___wargv1>uafxcwd.lib(appcore.obj) : error L

error LNK2001: 無法解析外部符號 "public: void __thiscall Cmfc_DeleteFileDlg::OnBnClickedButton3(void)"

連結錯誤:出現這個2001錯誤,是因為連結失敗,然而連結失敗,又是因為以下原因:  1.你在標頭檔案中聲明瞭函式,但是cpp檔案缺少了函式實現部分。  2.忘了將這個.h,.cpp Add to project;  3.以上兩種情況都沒有做,沒有將它對應的lib檔案新增到

VS error LNK2001無法解析外部符號_CrtDbgReportW

本文提供的只是可能的一種解決方案,一種解決這個錯誤的思路,並不一定符合所有情況。 最近經常遇到這個錯誤,總是在解決後忘記怎麼解決的,下次又花費很多時間去找原因。今天,做個筆記,嗯。 首先,列出原因: 其次,給出解決方法: 這是解決前問題根源:

編譯Qt時遇到”error LNK2001: 無法解析外部符號

解決辦法:執行QT的命令列工具 From a command prompt, change the directory to hello, and typeqmake -project to create a platform-independent project fil

原:.obj : error LNK2001: 無法解析外部符號 __imp__

     我把一個編譯成功的VC2008下的工程標頭檔案和.cpp檔案放到新建的另一個目錄,並且,按照原工程,把 工具->選項->專案和解決方案中的響應目錄都已經改好了。後來編譯還是有“連線錯誤”=.obj : error LNK2001: 無法解析的外部符號

[VS2013]C++中呼叫Python指令碼提示 error LNK2001: 無法解析外部符號__imp_PyString_FromString等錯誤的解決方案

配置如下 VS2013專案: Win32 Console,Release X64  包含目錄   : C:\Python27\include 庫 目 錄     : C:\Python27\libs

error LNK2019,error LNK2001:無法解析外部符號

環境:win7 ,vs2010 目的:安裝protobuf 問題:     test.pb.obj : error LNK2019: 無法解析的外部符號 "public: virtual __thiscall google::protobuf::MessageLite::~

VC++ Error LNK2001無法解析外部符號情況及解決辦法

二.由於編譯和連結的設定而造成的LNK2001   1.如果編譯時使用的是/NOD(/NODEFAULTLIB)選項,程式所需要的執行庫和MFC庫在連線時由編譯器寫入目標檔案模組,   但除非在檔案中明確包含這些庫名,否則這些庫不會被連結進工程檔案。在這種情況下使用/NOD將導 致錯誤LNK2001。 2.如

error LNK2001: 無法解析外部符號 Qt的moc機制

先轉一下其他人的帖,同樣是error LNK2001的問題。 第一次來發個帖,如果可能的話期望找到根本原因! 幾天沒有關注我的QT程式,再次拿出來編譯後竟然出現連線錯誤,因為四體不勤,沒有頻繁的checkin,所以無法找到中間版本,只能解決問題了。 1>MainWindowBottomWidget.o