我一直在使用Windows VC ++ 2008中的程序。我开始将所有代码都放在.cpp文件中(只是为了让一切正常工作),现在将内容分解为.h和.cpp文件。当我编译时,我得到了一大堆LNK2005错误,说明:
Object.obj : error LNK2005: "__thiscall thing::thing(args)" already defined in otherObject.obj
当我制作原始程序时,我不断收到未声明标识符的错误,因此我给出了一个include指令来满足它。现在,当我将所有内容分解为单独的.cpp和.h文件时,我得到了所有这些。我开始寻找哪个地方(对象,其他对象或事物),或其他地方。
答案 0 :(得分:3)
基本上,您在两个翻译单元(TU)中定义thing::thing(args)
,这违反了单一定义规则(ODR),因此违反了错误。
链接器确切地告诉您涉及哪些TU:otherObject.obj
和Object.obj
。
开始查看otherObject.cpp
和Object.cpp
以及这两个cpp
文件中包含的标头。您很可能已在头文件中定义了构造函数thing::thing(args)
,并且在这两个cpp
文件中包含该头文件会导致多个定义。
建议的解决方案:
您无法在头文件中定义构造函数,您需要将其与该类的其他成员函数一起添加到cpp
文件中。如果必须将构造函数的定义添加到标题,则应将其标记为inline
,假设您未显示代码,我认为没有任何理由应用第二种方法。
答案 1 :(得分:0)
根据你问题中的信息,我敢打赌,该方法是在头文件中定义的,但没有标记为内联。这会导致重复的符号链接器错误。尝试将内联方法标记为hte方法或将定义移动到源(.C
)文件。