追踪LNK2005:“已定义”

时间:2012-01-31 14:13:26

标签: c++ windows

我一直在使用Windows VC ++ 2008中的程序。我开始将所有代码都放在.cpp文件中(只是为了让一切正常工作),现在将内容分解为.h和.cpp文件。当我编译时,我得到了一大堆LNK2005错误,说明:

Object.obj : error LNK2005: "__thiscall thing::thing(args)" already defined in otherObject.obj

当我制作原始程序时,我不断收到未声明标识符的错误,因此我给出了一个include指令来满足它。现在,当我将所有内容分解为单独的.cpp和.h文件时,我得到了所有这些。我开始寻找哪个地方(对象,其他对象或事物),或其他地方。

2 个答案:

答案 0 :(得分:3)

基本上,您在两个翻译单元(TU)中定义thing::thing(args),这违反了单一定义规则(ODR),因此违反了错误。
链接器确切地告诉您涉及哪些TU:otherObject.objObject.obj

开始查看otherObject.cppObject.cpp以及这两个cpp文件中包含的标头。您很可能已在头文件中定义了构造函数thing::thing(args),并且在这两个cpp文件中包含该头文件会导致多个定义。

建议的解决方案:

您无法在头文件中定义构造函数,您需要将其与该类的其他成员函数一起添加到cpp文件中。如果必须将构造函数的定义添加到标题,则应将其标记为inline,假设您未显示代码,我认为没有任何理由应用第二种方法。

答案 1 :(得分:0)

根据你问题中的信息,我敢打赌,该方法是在头文件中定义的,但没有标记为内联。这会导致重复的符号链接器错误。尝试将内联方法标记为hte方法或将定义移动到源(.C)文件。