我有以前編譯C++程序,但用的Jamfiles碴後,該程序不再編譯和ld
發出的duplicate symbol error
的起源。這之後依次恢復到原來的Jamfiles,運行bjam clean
,用手除去的對象,並從與所述的gcc前端鐺到在MacOS 10.6.7的gcc 4.2.1切換持續。瞭解一個鏈接複製符號錯誤
方案的簡化說明的是,有main.cpp
和四個文件,a.h,cpp
和b.h,cpp
,其被編譯到鏈接到main.o
靜態庫。 main.cpp
和b.cpp
都取決於包含違規符號off.h
的文件,通過兩個不同的中間文件,但a.h
和a.cpp
都不以off.h
以任何方式依賴。
你問之前,我確信,所有文件都被包裹在多個定義衛士(#ifndef
,#define
,#endif
),雖然我沒有發現失蹤了他們一個文件,它沒有引用off.h
。更重要的是,b.h
不包括任何引用off.h
,只有實施,b.cpp
,使得以off.h
任何引用。這讓我感到困惑。
爲了增加我的困惑,我能夠從b.cpp
中刪除對off.h
的引用,並且如預期的那樣,它已成功重新編譯。但是,當我添加引用時,它也成功編譯,並在清除目標文件後繼續這樣做。對於爲什麼它未能編譯,我仍然感到茫然,特別是考慮到這些符號不應該衝突,我避免了符號重複,並且我已經擺脫了任何先前的/不完整的構建。
因爲我是能夠成功地編譯我的程序,我懷疑我能重現它來測試任何建議。但是,我很好奇這是如何發生的,如果我將來遇到這種情況,如果超出我所做的任何事情,我可以怎樣解決它?
您期待我們診斷無法重現自己的錯誤? – 2011-05-24 20:07:53
@尼爾,並非如此。注意:我能夠重現這個問題,以便在編譯時進行多次嘗試,直到遇到「解決方案」。而且,由於問題沒有再次出現,我預計答案會更加理論化,而不是具體化。但是,我試圖更好地理解什麼可能會導致在兩個單獨的編譯單元中引用的符號在不存在衝突時發生衝突。還有什麼,如果有的話,我可以採取額外的步驟來診斷和緩解這個問題。 – rcollyer 2011-05-24 20:18:37
我想給你90%的機會,實際上並沒有清除所有的目標文件(可能是libtool或其他東西將它們隱藏在隱藏的目錄中?)。儘管如此,如果你不能複製它,那麼就沒有辦法做到這一點。 – bdonlan 2011-05-24 20:41:38