1. 程式人生 > >鏈接錯誤:multiple definition of 'xxx' 問題解決及其原理

鏈接錯誤:multiple definition of 'xxx' 問題解決及其原理

水管 及其 head 外部聲明 重復元素 img 一定的 原理 重復

內容借鑒 於CSDN炸雞叔

錯因 截圖:

技術分享圖片

“multiple definition of ‘head‘ ”  “multiple definition of ‘tail‘ ”

解決過程:

1.首先要 區別 變量的定義 和 聲明

聲明是向 編譯器介紹名字---標識符,它告訴編譯器“這個函數或變量 在哪兒可找到,模樣”;

而定義是說: “在這裏建立變量或函數”,即為變量或函數 分配存儲空間。

對於變量,編譯器確定變量的大小,然後在內存中開辟空間來保存其數據。

對於函數,編譯器會生成代碼,這些代碼最終也要占用一定的內存。

總之,建立空間的聲明即為“定義”, 不需要建立存儲空間的即為“說明”

-------------------------------------------------------------------------------------------

2.一般在.h文件中定義個變零聲明時,再在其他文件中只要包含這個.h文件, 編譯時就會獨立被編譯器解釋,

然後每個.c文件就會生成獨立的標識符和符號表,所以上訴代碼在單獨編譯時並不會報錯,語法是合法的。

但是,最後在編譯器鏈接的時候,就會將工程中所有的符號整合在一起,由於文件中有重復的變量。

於是就會出現重復定義的錯誤,系統就會提示:multiple definition of ‘xxxx‘

  進一步解釋,在編譯每一個.c文件時,相當於一條有管道包圍的縱向水流,二者間不幹擾,

當鏈接時兩條原本獨立的水管就變為橫向流了,所以就出現了重復元素。所以當進行鏈接時就會出現重復定義的標識符。重復定義的標識符在這裏只是變量,而函數不會。因為函數確實只在.c中定義了一次,多次聲明是沒問題的,而變量確實出現了兩次定義。

兩次重復的變量定義鏈接器就不知道該用哪個地址作為變量的內存,所以報錯

-------------------------------------------------------------------------------------------------------

3.其實只需要將全局變量從.h文件中移到.c文件中,然後在.h文件中用extern做外部聲明

註意在.h文件中不要對變量初始化賦值了

簡單說,有兩個.c文件和一個.h文件,只要在一個.c文件定義全局變量(int a),再在.h中extern做外部聲明就可(extern int a)。

鏈接錯誤:multiple definition of 'xxx' 問題解決及其原理