天天看點

C++ "multiple definition of .. first defined here"C++ "multiple definition of .. first defined here"

在C++中,有時候需要在不同檔案中使用同一個變量。對于這類變量如果處理不當,很容易出現“multiple definition of... first defined here”的錯誤。

例如,定義了如下3個檔案:global.h, a.cpp, b.cpp

執行編譯指令:

提示錯誤為:

/tmp/ccc7OcsO.o:(.bss+0x0): multiple definition of `b' /tmp/ccs7q2VA.o:(.bss+0x0):第一次在此定義

出錯原因:a.cpp和b.cpp先分别被編譯為.o格式的目标檔案,兩個目标檔案再被連結器連結起來,這當中a.cpp和b.cpp分别進行了一次include,相當于global.h中的代碼重複出現了一次。因為a是const類型,是以重新定義也沒事;但是b隻是普通變量,重複定義顯然不行。

顯然,一個解決辦法是把b定義為const int類型。或者,定義成static int類型也行。

還有一種解決方案,就是把global.h變為global.c檔案,a.cpp和b.cpp中不再include它,但是編譯的時候把global.c也編譯進去,就可以了:

再舉一個class相關的例子。比如有Body和Mouth兩個類,Body的greet方法會調用Mouth的say方法,而main函數中會調用全局變量body的greet方法。為了隻是用一個body和一個mouth對象,可以這麼寫:

上面代碼中的include,雖然都是用的尖括号,但因為編譯時可以通過指定include路徑,不會出問題~

編譯指令:

能夠正常運作。

繼續閱讀