簡體   English   中英

使用預編譯頭重組項目中某些文件的依賴關系會導致鏈接器錯誤

[英]restructuring dependencies of some files in a project using precompiled headers causes linker errors

我正在使用MSVC ++ 6來構建一個非常大的項目。 該項目中的某些源文件與一個小的實用程序共享,我們使用它來維護應用程序。 以前,此小型實用程序需要鏈接到主應用程序中的許多庫,並且還需要在運行時添加主應用程序的DLL。 我的任務是刪除這些依賴關系,這聽起來很簡單……不幸的是,主應用程序中使用的預編譯頭文件給我帶來了很多麻煩。

我首先對實用程序中的所有文件進行了重新處理,以明確包含它們所需的所有內容,然后刪除了PCH的#include指令(這刪除了該實用程序95%的不必要依賴項)。 這對於編譯實用程序非常有用。 但是,現在,編譯主應用程序給我有關缺少預編譯標頭指令的錯誤。 我以為“太好了,我將有條件地包括PCH”。 這似乎不工作...我得到“意外#ENDIF”,提到這里 我的下一個想法是,在實用程序和主應用程序之間共享的三個源文件中,關閉主應用程序中的PCH。 編譯成功,但是在鏈接過程中出現了一系列錯誤,如下所示:

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

AFAICT,所有多重定義的符號都是我明確包含在共享文件中的符號,以避免需要PCH。 我的直覺是,由於我將這3個文件鏈接到與PCH .cpp文件相同的DLL中,因此它們在多個位置進行編譯。 有沒有辦法擺脫這個爛攤子? 我會嘗試任何事情...

當編譯器在處理編譯單元時找到符號X的定義時,它將為鏈接器創建提示:X在這里!

兩個源文件的編譯(都#include帶有定義的標頭(即不僅僅是聲明))將導致兩個目標文件定義相同的符號。 鏈接器將找到一個符號乘以定義。

因此,您的stripledescypher對象文件似乎包含WCString::lenght()const方法的定義。 這可能是由於函數主體是在類的標頭中定義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM