代碼編譯多重定義
❶ C++中兩個文件讀取一個.h時多個多重定義錯誤
從昨晚到現在查了很多東西,但結果卻超級簡單:
首先#include在編譯時會被預處理器將.h中的所有內容拷貝到當前文件中, 如果.h中還include了別的.h, 則遞歸拷貝;
如果.h文件中沒有頭文件保護,即#ifndef ... #define ... #endif則如果某文件include 1.h和 3.h, 而1.h也#include了3.h, 則會有完全相同的兩份3.h中的代碼, 這樣就直接報錯了; 但加入了頭文件保護後就可以保證在單一文件中只會編譯一遍3.h的代碼;
所以到目前為止如果加入了頭文件保護,在單一文件中不會有重聲明(定義),編譯可以通過,生成各個.o文件了, 頭文件中定義的變數都定義並分配了空間,就你的問題而言,tool.o中有Map, 同時main.o中也有Map;
然後就是鏈接了,此時會將各.o中的全局符號加入全局符號表中,如果.o中有相同的全局變數則會報重定義, 即tool.o和main.o中的Map沖突了。
總結下:頭文件保護只是保證在 單一文件中不會重復include, 但不保證在不同文件中重復include。
解決辦法為在.h中只聲明變數: extern map Map; 而在tool.cpp中定義: map Map;
多謝問題哈,終於搞清楚了這個問題!
❷ 編譯C程序出現多重定義,怎麼解決
應該是你在2個c文件中都定義了全局的MmiUtil_WaitKeyMenu,可以聲明為static,或者改個名字
❸ c語言編譯時one or more multiply defined symbols found 。剛學c求大俠幫忙看看
意思是:一個或多個符號定義錯誤。
解決的方法和詳細的操作步驟如下:
1、第一步,將源代碼保存在文件中,然後編譯並運行,如下圖所示,然後進入下一步。
❹ C語言編譯出現了 多重定義的符號 的報錯
同一個工程中創建了多個main函數
關閉當前工程,另建一個工程後重新編譯
