2009-11-24 46 views
9

我正在编译一些依赖于包含防护的代码来防止对象和函数的多重定义,但Visual Studio 2008给我的链接错误有多个定义。我不明白为什么,因为我以前使用的代码非常类似,并且没有造成问题。我一定在做些愚蠢的事情,但我不知道它是什么。我也尝试去掉包含卫士并使用#pragma一次,但我得到相同的链接错误。我应该检查什么?为什么不包括曾经工作的警卫或杂注?

回答

17

如果它们是链接器错误,最可能的原因可能是标头中定义的非内联函数。

如果在包含在多个源文件中的头中有一个非内联函数,它将在每个源文件(“翻译单元”)中定义,因此该函数将被定义为多于一次,因此多重定义错误。

+0

是的,你是对的...哎呀。谢谢! – Stewart 2009-11-24 04:52:18

+0

你也可以通过制作模板来使它们变成弱符号 – 2009-12-09 10:39:33

0

如果你遇到链接器错误...你确定你不是1)在代码中实际定义一个函数两次或2)试图做一些愚蠢的事情,如源文件(与头文件相反)#include )?

0

这也可能是由于使用链接其他库的不同版本的cstd库引起的。请在C++/Code生成部分下检查并确保所有项目都使用相同的设置。