鏈接錯誤:multiple definition of 'xxx' 問題解決及其原理
內容借鑒 於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' 問題解決及其原理