2009-07-07 56 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方法的定义。这可能是由于函数体在类头中定义的或类似的东西。