1. 程式人生 > >處理連結錯誤LNK2001

處理連結錯誤LNK2001

  以下是可能產生LNK2001錯誤的原因:  一.由於編碼錯誤導致的LNK2001

1.不相匹配的程式程式碼或模組定義(.DEF)檔案能導致LNK2001。例如如果在C++原始檔內聲明瞭一變數“var1”,卻試圖在另一檔案內以變數“VAR1”訪問該變數,將發生該錯誤。2.如果使用的行內函數是在.CPP檔案內定義的,而不是在標頭檔案內定義將導致LNK2001錯誤。3.呼叫函式時如果所用的引數型別同函式宣告時的型別不符將會產生LNK20014.試圖從基類的建構函式或解構函式中呼叫虛擬函式時將會導致LNK20015.要注意函式和變數的可公用性,只有全域性變數、函式是可公用的。靜態函式和靜態變數具有相同的使用範圍限制。當試圖從檔案外部訪問任何沒有在該檔案內宣告的靜態變數時將導致編譯錯誤或

LNK2001  函式內宣告的變數(區域性變數只能在該函式的範圍內使用。C++ 的全域性常量只有靜態連線效能。這不同於C,如果試圖在C++的多個檔案內使用全域性變數也會產生LNK2001錯誤。一種解決的方法是需要時在標頭檔案中加入該常量的初始化程式碼,並在.CPP檔案中包含該標頭檔案;另一種方法是使用時給該變數賦以常數。  二.由於編譯和連結的設定而造成的LNK2001

1.如果編譯時使用的是/NOD(/NODEFAULTLIB)選項,程式所需要的執行庫和MFC庫在連線時由編譯器寫入目標檔案模組,但除非在檔案中明確包含這些庫名,否則這些庫不會被連結進工程檔案。在這種情況下使用/NOD將導致錯誤LNK2001
2
.如果沒有為wWinMainCRTStartup設定程式入口,在使用UnicodeMFC時將得到“unresolved external on [email protected]LNK2001錯誤資訊。
3.使用/MD選項編譯時,既然所有的執行庫都被保留在動態連結庫之內,原始檔中對“func”的引用,在目標檔案裡即對“__imp__func” 的引用。如果試圖使用靜態庫LIBC.LIBLIBCMT.LIB進行連線,將在__imp__func上發生LNK2001;如果不使用/MD選項編譯,在使用MSVCxx.LIB連線時也會發生LNK20014.使用/ML選項編譯時,如用LIBCMT.LIB連結會在
_errno上發生LNK2001
5.當編譯除錯版的應用程式時,如果採用發行版模態庫進行連線也會產生LNK2001;同樣,使用除錯版模態庫連線發行版應用程式時也會產生相同的問題。6.不同版本的庫和編譯器的混合使用也能產生問題,因為新版的庫裡可能包含早先的版本沒有的符號和說明。  程式設計時打開了函式內聯(/Ob1/Ob2),但是在描述該函式的相應標頭檔案裡卻關閉了函式內聯(沒有inline關鍵字),這時將得到該錯誤資訊。為避免該問題的發生,應該在相應的標頭檔案中用inline關鍵字標誌行內函數。8.不正確的/SUBSYSTEM/ENTRY設定也能導致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

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. 執行緒執行時庫設定錯誤, 提示:

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++"屬性頁,

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

其中,

Single-Threaded                 單執行緒靜態連結庫(release版本)

Multithreaded                   多執行緒靜態連結庫(release版本)

multithreaded DLL               多執行緒動態連結庫(release版本)

Debug Single-Threaded           單執行緒靜態連結庫(debug版本)

Debug Multithreaded             多執行緒靜態連結庫(debug版本) )

Debug Multithreaded DLL         多執行緒動態連結庫(debug版本)

相關推薦

處理連結錯誤LNK2001

  以下是可能產生LNK2001錯誤的原因:  一.由於編碼錯誤導致的LNK2001 1.不相匹配的程式程式碼或模組定義(.DEF)檔案能導致LNK2001。例如, 如果在C++原始檔內聲明瞭一變數“var1”,卻試圖在另一檔案內以變數“VAR1”訪問該變數,將發生該錯誤。2.如果使用的行內函數是在.C

VC++的連結錯誤LNK2001

帖子轉自zhhxidian2005的部落格 感謝作者提供內容! 晚風也渡 發表於 2003-1-9 17:51:45主題 VC++的連結錯誤LNK2001(ZT)學習VC++時經常會遇到連結錯誤LNK2001,該錯誤非常討厭,因為對於程式設計者來說,最好改的錯誤

VC++的連結錯誤LNK2001(轉)

在VC/MFC社群中經常看到有人問一些編譯錯誤怎麼解決的問題,很多錯誤都是VC++的連結錯誤LNK2001,所以把這篇我記不得從什麼地方獲得的文章貼出來,也許對大家有點幫助。在此要感謝本文的原始作者,為他的專業精神!         學習VC++時經常會遇到連結錯誤LNK20

VC++ 6.0 連結錯誤LNK2001“原因及解決辦法

出現error LNK2001主要是有以下原因導致:1.在工程中include "***.h"添加了,但沒有Add to Project,然而工程中又要用到***.h中定義的函式。2.應用lib檔案導致。解決方法:1.將***.h 和***.cpp Add to Project. 如在此可能是hcomm.h,

連結錯誤LNK2001(轉貼)

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

VC++的連結錯誤LNK2001(轉貼)

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

VC++經常會遇到的連結錯誤LNK2001

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

【菜鳥】VC++的連結錯誤LNK2001

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

7.3 錯誤處理-連結程序

-module(normal). -export([start/1, p1/1, test/1]). start(N) -> register(start, spawn_link(normal, p1, [N - 1])). p1(0) -> top1();

Mysql 下載安裝及連結錯誤處理

Mysql 安裝最方便的是用rpm包, 官方網站有下載。 對開發人員來說, 需要下載的包有幾個: Mysql-server   服務端 Mysql-client     客戶端,通過 mysql -uroot -p  可以進入到伺服器端檢視資料庫(看遠端主機用 mysq

keil 編譯通過 連結錯誤 解決

今天試了一個nordic sdk5_12.3的例子,開啟後編譯連結,結果編譯通過,連結卻提示有4個函式沒有宣告,但是回頭再看檔案,明明有引用標頭檔案啊,,為什麼還不過呢?我又試了使用extern宣告還是不行。 linking... .\_build\nrf51422_xxac.axf: Er

如何處理Eclipse錯誤訊息 The declared package does not match the expected package

我從github下載了一個開源專案後,匯入到自己Eclipse之後,遇到了這個煩人的錯誤訊息: The declared package "com.sap.smartService" does not match the expected package "main.java.com.sap.smartSer

如何處理Eclipse錯誤消息 The declared package does not match the expected package

下載 分享 開源項目 錯誤 rop cte 是我 遇到 images 我從github下載了一個開源項目後,導入到自己Eclipse之後,遇到了這個煩人的錯誤消息: The declared package "com.sap.smartService" does not m

【C++】 Debug 版的 C/C++ Python 擴充套件模組連結錯誤:Error LNK1104 cannot open file 'python27_d.lib

Debug 版的 C/C++ Python 擴充套件模組連結錯誤:Error LNK1104 cannot open file 'python27_d.lib' 環境配置 (1)python的lib 以及標頭檔案分別加到vc的include/lib directories中去。

.Net Core 商城微服務專案系列(五):使用Polly處理服務錯誤

專案進行微服務化之後,隨之而來的問題就是服務呼叫過程中發生錯誤、超時等問題的時候我們該怎麼處理,比如因為網路的瞬時問題導致服務超時,這在我本人所在公司的專案裡是很常見的問題,當發生請求超時問題的時候,我們希望能夠自動重試,或者是在發生服務錯誤時採取一定的策略,比如限流熔斷等等。 本篇將會使用Polly處理服

如何處理Docker錯誤訊息:please add——insecure-registry

本地安裝Kubernetes時,遇到如下的錯誤訊息: pleade add --insecure-registry gcr.io to daemon's arguments   解決方案:點選Docker的Preference選單:

遠端桌面連結錯誤:由於CredSSP加密Oracle修正

一.windows 10 家庭版 新增組策略(企業版跳過) 在桌面上新建檔案“add_gpedit.bat”,用記事本開啟,複製新增下面的程式碼   @echo off   pushd "%~dp0"   dir /b C:\Windows\servicing\Packag

JavaScript區域性錯誤處理、全域性錯誤處理錯誤上報模組設計

   JavaScript引擎執行JavaScript程式碼時,會發生各種錯誤:可能是語法或拼寫錯誤,可能是瀏覽器差異(使用了瀏覽器特有功能),也可能是伺服器返回異常未處理,當然還有許多其它不可預知的因素。當錯誤發生時,JavaScript 引擎會中斷後續程式碼執行,並生成一個錯誤訊息。為了

MySQL錯誤處理--1146錯誤

在MySQL的主從複製過程中,出現了1146錯誤。提示的錯誤原因是:在預設的資料中找不到指定的表。show slave status\G;現實的同步狀態。Slave_IO_Running: YESSlave_SQL_Running: NoLast_Errno: 1146Last_Error: Error 'T

Qt Creator 編譯 ROS 包出現連結錯誤解決辦法

若編譯過程中,出現 cannot find -ltf cannot find -lroscpp ... 主要是因為 Qt 編譯 ROS 後連結環節出現問題,主要原因是 Qt 啟動時沒有載入 ROS 相關的環境變數,解決辦法如下: sudo vim /usr/share/ap