相信大家在寫c語言標頭檔案的時候都遇到過以下的錯誤(如果你沒有遇到過,說明寫的**量還不夠多哦):
error 6 error lnk2005: _structuretmp already defined in main.obj structure.obj pagereplace
error 7 fatal error lnk1169: one or more multiply defined symbols
問題的大概意思就是你對某些變數進行了重複的定義,出現這種錯誤的原因是你在標頭檔案中定義了某個函式或是定義了某個變數,然後又在多個原始檔中包含了這個標頭檔案,結果系統在鏈結的時候就會報這種錯誤,如下面的**
structure.**件內容如下:
int i = 0;
int k;
int test();
int test1()
structure.c檔案如下:
#include
#include 「structure.h」
int test()
main.c檔案如下
#include
#include 「structure.h」
int main()
編譯鏈結的時候會出現以下的錯誤:
error 1 error lnk2005: _test1 already defined in main.obj structure.obj headtest
error 2 error lnk2005: _i already defined in main.obj structure.obj headtest
error 3 fatal error lnk1169: one or more multiply defined symbols found c:\users\shangxuan\vc2008\headtest\debug\headtest.exe 1 headtest
網上像這種問題說了很多解決辦法,大部分都是說在標頭檔案中加上乙個標識,使得標頭檔案在乙個工程中只被引用一次,如將標頭檔案改為:
#ifndef _inc_structure
#define _inc_structure
int i = 0;
int k;
int test();
int test1()
#endif
這樣在鏈結的時候,乙個工程中即使有該標頭檔案的多次引用,實際上也只會引用一次,可是在這個工程中,大家不防加上這三行**,再鏈結一下試試,發現問題依舊是存在的,說實話,這種問題當初也困擾了我乙個下午,到網上也搜了很多的資料,可是大家的解決方法都是和上面的一樣(鬱悶,大家都互相抄襲),就是解決不了這個問題,自己以測試了很長時間,才發現錯誤的根源。
其實為了說明這類問題,我在上面的**中有意的進行了比較,變數定義了兩個,函式定義了兩個,可是鏈結的時候其中乙個變數和其中乙個函式報發重複定義的錯誤,可是另個乙個卻沒有,這就是問題的關鍵,因為變數i和函式test1在標頭檔案中是進行了定義,而k和函式test在標頭檔案中只是進行了申明,並沒有定義,所以不會出現重定義的錯誤,說到這,大家應該知道如何解決這類問題了,那就是在標頭檔案中永遠只進行申明,不進行定義,這樣這類問題就將不復存在
另外,大家也許想在標頭檔案中申明乙個變數,然後在多個原始檔中可以使用這個變數,可是由於在標頭檔案中不能對變數進行初始化,在原始檔中引用勢必會出現錯誤(基本資料型別的變數或許不會出現錯誤,可是如果是乙個結構體啥的,基本是會出現錯誤的),那麼如何解決這個問題呢,有兩個辦法:
1.正如上面所說的問題,在structure.c檔案中直接對變數i賦值,然後在其它原始檔中就可直接使用
2.變數的申明在structure.c時行,然後在structure.**件中進行外部變數申明,方法為extern int i;
這樣再structure.c檔案中定義了變數i後,在標頭檔案中只需要時行外部變數申明,即可在引用該標頭檔案
的所有的原始檔中使用變數i了
最後,我想說的是,以上說的第一種方法,也就是#ifndef _inc_structure #define _inc_structure方法,也不是一點用沒有,標準的c語言標頭檔案應該以這樣的語句開頭,所以且不管它有沒有用,大家在定標頭檔案的時候最好加上以上語句,畢竟按照標準走,總沒有壞處的
Error LNK2005解決方法
程式設計中經常能遇到lnk2005錯誤 重複定義錯誤,其實lnk2005錯誤並不是乙個很難解決的錯誤。弄清楚它形成的原因,就可以輕鬆解決它了。造成lnk2005錯誤主要有以下幾種情況 1 重複定義全域性變數。可能存在兩種情況 a 對於一些初學程式設計的程式設計師,有時候會以為需要使用全域性變數的地方...
error LNK2005編譯錯誤 EVC
error lnk2005錯誤有很多種,有些跟.h標頭檔案引用順序有關,有些與lib庫的引用順序有關,難以捉摸。最近在做fbreader移植到wince系統就遇到了這兩種情況,故而記之。問題現象一 重複定義,錯誤提示如下 標頭檔案順序 include zlfile.h include zlzdeco...
error LNK2005的可能可行解決方案
引言 程式設計時,經常能遇到lnk2005錯誤 重複定義錯誤,但實際上,這不是個很難搞定的問題。下面我將就以下個方面和大家一起 這個錯誤的發生和解決。1.重複定義全域性變數。這類情況一般又分為兩種 a.對於一些初學程式設計的程式設計師 比如說我 有時候會以為在需要使用全域性變數的時候可以使用定義宣告...