1. 程式人生 > >[問題解決] multiple definition of `***'

[問題解決] multiple definition of `***'

make發現問題如下:


我是把 

pthread_mutex_t VT_Mutex;  

這一句寫在 init.h 裡面。然後很多檔案包含這個 init.h 。

一般在.h檔案中定義一個變數宣告時,在其他檔案中只要包含了這個.h檔案,編譯的時候就會獨立被編譯器解釋,然後每個.C檔案會生成獨立的識別符號和符號表,所以上述程式碼在單獨編譯的時候並不會報錯,語法是合法的。但是,最後在編譯器連結的時候,就會將工程中所有的符號整合在一起,由於檔案中有重複的變數,於是就會出現重複定義的錯誤,系統就是提示你“multiple definition of `xxx`”。   進一步解釋,我們可以這樣想象編譯每一個C原始檔時,相當於一條有管道包圍的縱向水流,二者互不干擾。當連結時兩條原本相互獨立的水管橫向流了,所有就出現了重複的元素。所以當進行連結時就會出現重複定義的標示符。重複定義的標示符在這裡只是變數,函式不會。因為函式確實只在.c中定義了一次,多次宣告是沒有問題的,而變數確實出現了兩次定義。兩次重複的變數定義連結器就不知道該已那個地址作為變數的記憶體,所以報錯。
  怎麼解決這個問題呢?   其實只需要將全域性變數定義從.h檔案中挪到.c檔案裡,然後在.h檔案中用extern做外部宣告即可。即在.c檔案中宣告變數,然後在標頭檔案.h所有的變數宣告前加上extern,注意在.h檔案中就不要對變數進行初始化賦值了。然後其他需要使用全域性變數的.c檔案中包含.h檔案即可。編譯器會為.c生成目標檔案,然後連結時,如果該.c檔案使用了全域性變數,連結器就會連結到此.c檔案。其他檔案需要使用此全域性變數也是同樣的方式,目的其實只有一個,就是使變數在記憶體中唯一化。

解決辦法:

把 pthread_mutex_t VT_Mutex;  寫在init.c 裡面,init.c include init.h


在init.h 裡面寫 extern pthread_mutex_t VT_Mutex;