1. 程式人生 > >錯誤:error LNK2005 解決方法

錯誤:error LNK2005 解決方法

程式設計中經常能遇到LNK2005錯誤——重複定義錯誤,其實LNK2005錯誤並不是一個很難解決的錯誤。弄清楚它形成的原因,就可以輕鬆解決它了。

造成LNK2005錯誤主要有以下幾種情況:
1.重複定義全域性變數。可能存在兩種情況:
A、對於一些初學程式設計的程式設計師,有時候會以為需要使用全域性變數的地方就可以使用定義申明一下。其實這是錯誤的,全域性變數是針對整個工程的。正確的應該是在一個CPP檔案中定義如下:intg_Test;那麼在使用的CPP檔案中就應該使用:extern int g_Test即可,如果還是使用intg_Test,那麼就會產生LNK2005錯誤,一般錯誤錯誤資訊類似:AAA.obj error LNK2005 int bookc?
[email protected]
@3HA already defined inBBB.obj。切記的就是不能給變數賦值否則還是會有LNK2005錯誤。
這裡需要的是“宣告”,不是“定義”!根據C++標準的規定,一個變數是宣告,必須同時滿足兩個條件,否則就是定義:
(1)宣告必須使用extern關鍵字;(2)不能給變數賦初值
所以,下面的是宣告:
extern int a;
下面的是定義
int a; int a = 0; extern int a =0;
B、對於那麼程式設計不是那麼嚴謹的程式設計師,總是在需要使用變數的檔案中隨意定義一個全域性變數,並且對於變數名也不予考慮,這也往往容易造成變數名重複,而造成LNK2005錯誤。

2.標頭檔案的包含重複。往往需要包含的標頭檔案中含有變數、函式、類的定義,在其它使用的地方又不得不多次包含之,如果標頭檔案中沒有相關的巨集等防止重複連結的措施,那麼就會產生LNK2005錯誤。解決辦法是在需要包含的標頭檔案中做類似的處理:#ifndefMY_H_FILE //如果沒有定義這個巨集
#define MY_H_FILE //定義這個巨集
……. //標頭檔案主體內容
…….
#endif
上面是使用巨集來做的,也可以使用預編譯來做,在標頭檔案中加入:
#pragma once
//標頭檔案主體
3.使用第三方的庫造成的。這種情況主要是C執行期函式庫和MFC的庫衝突造成的。具體的辦法就是將那個提示出錯的庫放到另外一個庫的前面。另外選擇不同的C函式庫,可能會引起這個錯誤。微軟和C有兩種C執行期函式庫,一種是普通的函式庫:LIBC.LIB,不支援多執行緒。另外一種是支援多執行緒的:msvcrt.lib。如果一個工程裡,這兩種函式庫混合使用,可能會引起這個錯誤,一般情況下它需要MFC的庫先於C執行期函式庫被連結,因此建議使用支援多執行緒的msvcrt.lib。所以在使用第三方的庫之前首先要知道它連結的是什麼庫,否則就可能造成LNK2005錯誤。如果不得不使用第三方的庫,可以嘗試按下面所說的方法修改,但不能保證一定能解決問題,前兩種方法是微軟提供的:
A、選擇VC選單Project->Settings->Link->Catagory選擇Input,再在Ignorelibraries的Edit欄中填入你需要忽略的庫,如:Nafxcwd.lib;Libcmtd.lib。然後在Object/libraryModules的Edit欄中填入正確的庫的順序,這裡需要你能確定什麼是正確的順序,呵呵,God bless you!
B、選擇VC選單Project->Settings->Link頁,然後在ProjectOptions的Edit欄中輸入/verbose:lib,這樣就可以在編譯連結程式過程中在輸出視窗看到連結的順序了。
C、選擇VC選單Project->Settings->C/C++頁,Catagory選擇CodeGeneration後再在User Runtime libraray中選擇MultiThreadDLL等其他庫,逐一嘗試。
關於編譯器的相關處理過程,參考:
http://www.donews.net/xzwenlan/archive/2004/12/23/211668.aspx

這就是我所遇到過的LNK2005錯誤的幾種情況,肯定還有其他的情況也可能造成這種錯誤,所以我不希望你在看完這篇文章以後再遇到LNK2005錯誤時候,不動腦筋的想對號入座的排除錯誤。程式設計的過程就是一個思考的過程,所以還是多多開動你的頭腦,那樣收穫會更多!  

相關推薦

錯誤error LNK2005 解決方法

程式設計中經常能遇到LNK2005錯誤——重複定義錯誤,其實LNK2005錯誤並不是一個很難解決的錯誤。弄清楚它形成的原因,就可以輕鬆解決它了。 造成LNK2005錯誤主要有以下幾種情況: 1.重複定義全域性變數。可能存在兩種情況: A、對於一些初學程式設計的程式設計師,有時候會以為需要使用全域性變數的地方就

[Visual Studio C++] [MFC 除錯錯誤]error LNK2005: "class std::...已經在 Multimediatimer.obj 中定義。

1.編譯問題描述: error LNK2005: "class std::basic_ofstream<char,struct std::char_traits<char> > Sim_Data_Write" ([email protected]@[email&

SQL2005在新建複製 找不到儲存過程 錯誤2812 的解決方法

標題: 新建釋出嚮導 ------------------------------ SQL Server 無法建立釋出“XXXXX釋出”。 ------------------------------ 其他資訊: 執行 Transact-SQL 語句或批處理時發生了異常。

git pull遇到錯誤error: Your local changes to the following files would be overwritten by merge:解決方法

error: Your local changes to the following files would be overwritten by merge: 意思是我桌上型電腦上新修改的程式碼的檔案,將會被git伺服器上的程式碼覆蓋;我當然不想剛剛寫的程式碼被覆蓋掉,看了git的手

執行selenium指令碼時,出現錯誤ERROR: install_util.cc(603) 解決方法

基於python語言的selenium指令碼,執行時,雖然也可以跑,但是會出現錯誤資訊,如圖: 原因:應該是找不到登錄檔資訊,MachineLevelUserCloudPolicyEnrollmentToken 解決方法: 1. 開啟登錄檔編輯器 使用快捷鍵,WI

HTTP 錯誤 500.19 Internal Server Error解決方法

輸入a dpi 編輯 模塊 cfi modules 位置 override 程序 第一種可能,能解決一部分問題 http://wenku.baidu.com/view/c5cb4a08bb68a98271fefa3f.html 第二種可能,解決另外一部分問題 經過檢查發

Win10 平安網銀控件安裝不上及登錄提示“簽名失敗...錯誤代碼1002”的解決方法

保護模式 我們 輸入 平安 原來 提醒 什麽 解決方法 站點 今天財務MM過來找哥,說平安的網銀登錄不了,求解決。打開平安網銀登錄界面,密碼輸入框提示需要下載控件。二話不說,下載安裝,重啟瀏覽器,發現控件提示還是傲嬌的存在著。一琢磨,下載一個網銀助手,修復系統環境,再進網銀

android -------- 安裝APK報錯Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE解決方法

記錄一個 DELETE_FAILED_INTERNAL_ERROR Error while Installing APK問題 之前遇到這個問題 方案1 將data/data/目錄下該應用的包名的目錄刪除掉,如:adb shell rm -rf data/data/c

【我的Android進階之旅】解決編譯出現錯誤Error: In DataSet 'main', no data file for changedFile.

一、問題描述 晚上在Android Studio上,切換分支之後,重新編譯執行的時候,報錯了,錯誤資訊如下所示: 錯誤資訊文字: FAILURE: Build failed with an excep

出現 DB2 SQL Error: SQLCODE = -1773, SQLSTATE = null 錯誤的原因及解決方法

1 錯誤描述 在專案從虛擬機器遷移到容器雲之後,生產環境在執行某個資料庫下所有表的新增及更新操作的時候,都會遇到 BD2 報出來的SQLCODE = -1773, SQLSTATE = null異常,從而導致該庫下所有涉及到新增和更新的操作全部失敗,具體的錯誤日誌如下: 2

Git使用在Git pull時遇到的Error解決方法

1. Error:    fatal: The remote end hung up unexpectedly    error: RPC failed; curl 18 transfer closed with outstanding read data remaining

error while loading shared libraries錯誤的原因及解決方法

在linux下執行程式時,發現了error while loading shared libraries這種錯誤,一時間不知道解決辦法,在網上搜索,終於解決了: ./tests: error wh

關於WIN10 edge瀏覽器報錯 找不到DNS地址 錯誤程式碼INET_E_RESOURCE_NOT_FOUND 的解決方法

一直使用WIN10自帶的edge瀏覽器,感覺習慣了挺好用的,突然這兩天變得特別慢,然後直接網頁都刷不開了,在網上找了很久原因,沒有一個比較好的解決辦法,無意間在一次網頁沒刷開的時候注意到網頁下面的錯誤報告,查過之後才知道原因出在哪裡。借鑑系統之家的一篇教程:http://mi

Nginx504錯誤_Bad Gateway的解決方法

瀏覽器控制檯輸出:Failed to load resource: the server respondedwith a status of 504 (Gateway Time-out 可通過檢視Nginx 中的logs找到問題所在(需要修改nginx.con

關於VS2012 (error MSB6001 “cmd.exe”的命令列開關無效。路徑的形式不合法)錯誤的一種解決方法

       工作上學習用的工程,從2008升級到2013中遇到的問題。編譯過程遇到 error MSB6001 “cmd.exe”的命令列開關無效。的錯誤 一時無法解決,在尋求無所不能的Google之後,終於發現了一個解決辦法。        原連結如下        h

轉 -- MySQL主從失敗, 錯誤Got fatal error 1236解決方法

原址如下: http://ritto.blog.51cto.com/427838/735810 MySQL主從失敗, 錯誤Got fatal error 1236解決方法 由於主伺服器異外重啟, 導致從報錯, 錯誤如下: show slave status錯誤: m

Android安裝APK報錯Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE解決方法

           今天除錯一個android應用的時候,安裝報了Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE錯誤,程式碼如下:[2015-12-28 15:54:31 - MainActivity] ----

解決在windows下VS2010編譯coldet20的出現的錯誤error MSB8008: 指定的平臺工具集(Windows7.1SDK)未安裝或無效。請確保選擇受支援的 PlatformToo

本機首先安裝了VS 2010。然後昨天才安裝上VSSSDK7.1。今天編譯一個專案報錯: 1>C:\Program Files(x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\x64\Microsoft.Cpp.x64.Targ

[爬蟲]爬蟲時碰到的IOError: [Errno ftp error] [Errno 10060]錯誤的原因以及解決方法

IOError: [Errno ftp error] [Errno 10060] 原因是爬取頁面過快造成暫時被網站ban掉的情況,設定time.sleep(1)就好,後來發現ban的時間不定,就自己動手寫了個暴力的做法 import time def