[問題解決] multiple definition of `***'
阿新 • • 發佈:2019-02-16
make發現問題如下:
我是把
pthread_mutex_t VT_Mutex;
這一句寫在 init.h 裡面。然後很多檔案包含這個 init.h 。
一般在.h檔案中定義一個變數宣告時,在其他檔案中只要包含了這個.h檔案,編譯的時候就會獨立被編譯器解釋,然後每個.C檔案會生成獨立的識別符號和符號表,所以上述程式碼在單獨編譯的時候並不會報錯,語法是合法的。但是,最後在編譯器連結的時候,就會將工程中所有的符號整合在一起,由於檔案中有重複的變數,於是就會出現重複定義的錯誤,系統就是提示你“multiple definition of `xxx`”。 進一步解釋,我們可以這樣想象編譯每一個C原始檔時,相當於一條有管道包圍的縱向水流,二者互不干擾。當連結時兩條原本相互獨立的水管橫向流了,所有就出現了重複的元素。所以當進行連結時就會出現重複定義的標示符。重複定義的標示符在這裡只是變數,函式不會。因為函式確實只在.c中定義了一次,多次宣告是沒有問題的,而變數確實出現了兩次定義。兩次重複的變數定義連結器就不知道該已那個地址作為變數的記憶體,所以報錯。解決辦法:
把 pthread_mutex_t VT_Mutex; 寫在init.c 裡面,init.c include init.h
在init.h 裡面寫 extern pthread_mutex_t VT_Mutex;