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

c++ error LNK2005......錯誤解決方法

今天被error LNK2005這個問題折騰了好久好久,從網上找了一些文章看了看,大多數都說是 標頭檔案包含比較混亂,同一個檔案被多個檔案包含了;還有的說是某兩個.dll檔案被忽略還是包含了什麼的,但是試了這兩個方法都不行,因為我新寫的函式只被一個檔案包含了,而且我也沒改過任何的.dll檔案。後來嘗試了很多方法,這個問題終於被解決了(只要在你想包含的檔案中的每個函式前加一個static,宣告其為區域性函式即可,對於被包含的檔案中的全域性變數也是加一個static即可),方法如下:

我的執行平臺是 VS2005 vc++.net (CRL),我使用了windows form,想在form1中點選某個按鈕時呼叫一個已經寫好的c++程式。

起初我的被包含的檔案為abc.cpp,並且已經被包含中form1.h中(#include "abc.cpp")

abc.cpp中的函式fun1定義如下:

int fun1(int c){return c;}

但是一編譯就出項如下問題:

main_test.obj : error LNK2005: "int __cdecl fun1(int)" ([email protected]@[email protected]) already defined in Mysystem.obj

所有的都不變,只要將fun1定義改為:

static   int fun1(int c){return c;}就可以了!!

程式設計中經常能遇到LNK2005錯誤——重複定義錯誤,其實LNK2005錯誤並不是一個很難解決的錯誤。弄清楚它形成的原因,就可以輕鬆解決它了。
  
   造成LNK2005錯誤主要有以下幾種情況:
  1. 重複定義全域性變數。可能存在兩種情況:
   A、對於一些初學程式設計的程式設計師,有時候會以為需要使用全域性變數的地方就可以使用定義申明一下。其實這是錯誤的,全域性變數是針對整個工程的。正確的應該是在一個 CPP檔案中定義如下:int g_Test;那麼在使用的CPP檔案中就應該使用:extern int g_Test即可,如果還是使用int g_Test,那麼就會產生LNK2005錯誤,一般錯誤錯誤資訊類似:AAA.obj error LNK2005 int book c?

[email protected]@3HA already defined in BBB.obj。切記的就是不能給變數賦值否則還是會有LNK2005錯誤。
   這裡需要的是“宣告”,不是“定義”!根據C++標準的規定,一個變數是宣告,必須同時滿足兩個條件,否則就是定義:
   (1)宣告必須使用extern關鍵字;(2)不能給變數賦初值
   所以,下面的是宣告:
   extern int a;
   下面的是定義
   int a; int a = 0; extern int a =0;
   B、對於那麼程式設計不是那麼嚴謹的程式設計師,總是在需要使用變數的檔案中隨意定義一個全域性變數,並且對於變數名也不予考慮,這也往往容易造成變數名重複,而造成LNK2005錯誤。
  
   2.標頭檔案的包含重複。往往需要包含的標頭檔案中含有變數、函式、類的定義,在其它使用的地方又不得不多次包含之,如果標頭檔案中沒有相關的巨集等防止重複連結的措施,那麼就會產生LNK2005錯誤。解決辦法是在需要包含的標頭檔案中做類似的處理:#ifndef MY_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,再在Ignore libraries 的Edit欄中填入你需要忽略的庫,如:Nafxcwd.lib;Libcmtd.lib。然後在Object/library Modules的Edit欄中填入正確的庫的順序,這裡需要你能確定什麼是正確的順序,呵呵,God bless you!
   B、 選擇VC選單Project->Settings->Link頁,然後在Project Options的Edit欄中輸入/verbose:lib,這樣就可以在編譯連結程式過程中在輸出視窗看到連結的順序了。
   C、 選擇VC選單Project->Settings->C/C++頁,Catagory選擇Code Generation後再在User Runtime libraray中選擇MultiThread DLL等其他庫,逐一嘗試。
   關於編譯器的相關處理過程,參考:
   http://www.donews.net/xzwenlan/archive/2004/12/23/211668.aspx  
   這就是我所遇到過的LNK2005錯誤的幾種情況,肯定還有其他的情況也可能造成這種錯誤,所以我不希望你在看完這篇文章以後,再遇到LNK2005錯誤時候,不動腦筋的想對號入座的排除錯誤。程式設計的過程就是一個思考的過程,所以還是多多開動你的頭腦,那樣收穫會更多! ————http://blog.csdn.net/chu_qun/article/details/3452614

相關推薦

c++ error LNK2005......錯誤解決方法

一 今天被error LNK2005這個問題折騰了好久好久,從網上找了一些文章看了看,大多數都說是 標頭檔案包含比較混亂,同一個檔案被多個檔案包含了;還有的說是某兩個.dll檔案被忽略還是包含了什麼的,但是試了這兩個方法都不行,因為我新寫的函式只被一個檔案包含了,而且我也沒改過任何的.dll檔案。後來嘗試了

安裝Matlab出現Error 1935錯誤解決方法

技術 啟動 運行 十進制 gist log ror oca 下拉菜單 1、開始 - 運行(輸入regedit.exe)- 確定或者回車,打開註冊表編輯器; 2、在打開的註冊表編輯器中找到:HKEY_LOCAL_MACHINE ,並展開:HKEY_LOCAL_MACHINE

64位系統安裝了32位的MySQL後出現的error LNK2019錯誤解決方法

1>mysql_test.obj : error LNK2019: 無法解析的外部符號 mysql_close,該符號在函式 main 中被引用 1>mysql_test.obj : error LNK2019: 無法解析的外部符號 mysql_free_result,該符號在函式 main 中

C#呼叫C++的DLL錯誤解決方法

一、報錯如下:無法載入DLL"**.dll":找不到指定的模組(異常來自HRESULT:0x8007007E)        此時若可以確定此dll就在bin目錄下,則說明是此dll呼叫別的dll,這時下載depends軟體,檢視此dll缺少的dll。  

C#調用C++的DLL錯誤解決方法

.dll exce 格式不正確 src 缺少 system32 ++ dll 加載dll 一、報錯如下:無法加載DLL"**.dll":找不到指定的模塊(異常來自HRESULT:0x8007007E) 此時若可以確定此dll就在bin目錄下,則說明是此dll調

yum groupinstall "X Window System" -y 出錯,提示Error Summary錯誤解決方法

首先說明一下,一般常用的yum安裝方式為yum install,這次安裝"X Window System"就使用了yum groupinstall,那麼這兩個命令有什麼區別那? yum 提供二種安裝軟體的方式 1,yum install 它安裝單個軟體,以及這個軟體的依賴關

error: C++ preprocessor "/lib/cpp" fails sanity check錯誤解決方法

ubunt essential header apt yum 運行命令 process all sso error: C++ preprocessor "/lib/cpp" fails sanity check 問題的解決 問題的根源是缺少必要的C++庫。如果是CentO

LIBCMT.lib(crt0dat.obj) : error LNK2005 錯誤解決方法

最近為了解決跨lib之間vector產生的問題,將link的Code Generation的Use run-time library 修改為MultiThreaded Dll,結果導致了系列錯誤。 LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit alread

libcmtd.lib(crt0dat.obj) : error LNK2005: _exit already defined in msvcrtd.lib(MSVCRTD.dll) 編譯錯誤解決方法

[問題描述] 今天在VC6下編譯G279軟體時,已編譯通過,連結時報一下錯誤: Linking...libcmtd.lib(crt0dat.obj) : error LNK2005: _exit already defined in msvcrtd.lib(MSVCRTD.d

Error, some other host already uses address 192.168.0.202錯誤解決方法

機器 虛擬機網卡 一個 already 局域網 使用 sysconf erro 錯誤 Error, some other host already uses address 192.168.0.202錯誤解決方法 今天配置虛擬機網卡的時候遇到錯誤:Error, so

ruby環境sass編譯中文出現Syntax error: Invalid GBK character錯誤解決方法

方法 添加 ali 編譯 sass編譯 body har class *** 這種錯誤是因為在scss文件中使用了中文註釋,導致轉css時出錯。 解決辦法: 找到ruby安裝路徑下的engine.rb文件,(我的在這裏 E:\Ruby22-x64\lib\ruby\gems

gatling壓力測試工具啟動gatling.bat命令行窗口報Error occurred during initialization of VM Could not reserve enough space for 1048576KB object heap錯誤解決方法

大於 spa ava color default class -xms 查看系統 測試 原因是:Java虛擬機(JVM)分配的內存大於系統可用內存數,所以沒有足夠的空間分配給JVM來創建Object 解決方法:編輯gatling.bat文件,查看系統剩余內存大小,修改分配的

Ubuntu下連接mysql出現 ERROR 1698 (28000): Access denied for user 'root'@'localhost'錯誤解決方法

use ces 數據 表示 vim amp https 創建 sel ubuntu版本:18.04 mysql版本:5.7.24 ubuntu安裝mysql後用root賬戶登入會出現問題:ERROR 1698 (28000): Access denied

Error parsing HTTP request header Larger錯誤解決方法

prop tom 緩沖區 ger connect ctp boot time conn 在tomcat裏進行配置 原因是Tomcat的header緩沖區大小不夠,只需要在server.xml中增加maxHttpHeaderSize字段即可: <Connector co

eclipse報錯:[Click the icon to add star.] Internal Error: java.lang.NullPointerException -----錯誤解決方法

linux系統下,eclipse出現以下報錯 [Click the icon to add star.] Internal Error: java.lang.NullPointerException的解決辦法 1、首先關閉MyEclipse工作空間。 2、然後刪除工作空間下的

高版本JDK的專案在低版本執行報 a jni error has occurred 錯誤解決方法

這個問題確實是由較高版本的JDK編譯的java class檔案試圖在較低版本的JVM上執行產生的錯誤。     1、解決措施就是保證jvm(java命令)和jdk(javac命令)版本一致。如果是linux版本,則在命令列中分別輸入java -version和javac -

convert: not authorized `@/tmp/tmpc9s7ayd6.txt' @ error/property.c/InterpretImageProperties/3.錯誤解決

OSError: MoviePy Error: creation of None failed because of the following error: convert: not authorized `@/tmp/tmpc9s7ayd6.txt' @ error/property.c/

protobuf編譯中遇到的c compiler cannot create executables錯誤解決方法

最近下載了最新的linux mint 16和ubuntu 12中分別嘗試編譯protobuf 2.5.0.但都是報c compiler cannot create executables的錯. 查過網上解決方案, 清一色都是export LIBS=之類的, 無法解決問題. 最終一個回帖啟發了我, 使用

c# https get請求 基礎連線已關閉,接受時發生錯誤 解決方法

用HttpWebRequest模擬傳送https請求,提示錯誤: 基礎連線已關閉,接受時發生錯誤在本地測試ok,開發環境為64位win7 vs2013 釋出到windows server 2008 x86系統上執行一直報錯。。下載2008 r2 x64執行發現數據正常。。pu

nginx的error.log日誌常見的幾個錯誤解決方法

nginx.conf裡會有兩個日誌,分為access.log 和 error.log。其中這兩個日誌可以細化,一般來說在nginx目錄下會有一個logs會儲存,然後也可以在對應的server目錄裡可以分別的設定access.log和error.log來了解對應server的情況。