1

我正在使用 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 中,因此它们在多个位置编译。有没有办法摆脱这种混乱?我会尝试任何事情...

4

1 回答 1

1

当编译器在处理编译单元时发现符号 X 的定义时,它会为链接器创建一个提示:X 在这里!

两个源文件的编译,都#include带有一个定义的头文件(即不仅仅是一个声明),将导致两个目标文件定义相同的符号。链接器将找到一个多重定义的符号。

因此,您的 stripledescypher 目标文件似乎包含该WCString::lenght()const方法的定义。这可能是由于在类的标题或类似内容中定义了函数体。

于 2009-07-07T19:16:34.787 回答