2009-07-07 55 views
1

我正在使用MSVC++ 6構建一個非常大的項目。該項目中的一些源文件與我們用於維護應用程序的小型實用程序共享。以前,這個小工具需要鏈接主應用中的許多庫,並且在運行時還需要主應用的DLL。我的任務是去除這些依賴關係,聽起來很簡單......不幸的是,主應用程序中使用的預編譯頭文件給我帶來了很多麻煩。使用預編譯頭文件重建項目中某些文件的依賴性導致鏈接器錯誤

我首先重寫了實用程序中的所有文件,以明確包含他們需要的所有文件,然後刪除了PCH的#include指令(這爲該實用程序刪除了95%的不必要的依賴關係)。這對於編譯實用程序非常有用。但是,現在,編譯主應用程序會給我提供有關缺少預編譯頭指令的錯誤。我認爲「很好,我只是有條件地包括PCH」。這似乎不工作......我得到「意想不到的#endif」,如here所述。我的下一個想法是在應用程序和主應用程序之間共享的三個源文件的主應用程序中關閉PCH。這編譯成功,但我在鏈接過程中得到了一堆看起來像這樣的錯誤:

tls7d.lib(tls707d.dll) : error LNK2005: "public: unsigned int __thiscall RWCString::length(void)const " ([email protected]@@QBEIXZ) already defined in stripledescypher.obj 

AFAICT,所有的多重定義的符號是那些我明確包括在共享文件,以避免對PCH的需要。我的直覺是,因爲我將這3個文件鏈接到與PCH .cpp文件相同的DLL中,所以它們被編譯在多個位置。有沒有辦法擺脫這個混亂?我會嘗試幾乎任何東西......

回答

1

當編譯器在處理編譯單元時發現符號X的定義時,它會爲鏈接器創建一個提示:X在這裏!

彙編兩個源文件,#include首標和定義(即不是單純的聲明)將導致兩個目標文件定義相同的符號。鏈接器將找到一個定義的符號乘法。

因此,看來您的stripledescypher目標文件包含WCString::lenght()const方法的定義。這可能是由於函數體在類頭中定義的或類似的東西。