我一直在做windows VC++ 2008中的一个程序。一开始,我将所有代码放在.cpp文件中(只是为了让一切正常工作),现在将代码分解成.h和.cpp文件。当我编译时,我得到了堆积如山的LNK2005错误,说明:
Object.obj : error LNK2005: "__thiscall thing::thing(args)" already defined in otherObject.obj当我编写原始程序时,我不断收到未声明标识符的错误,因此我给出了一个include指令来满足这一要求。现在,当我将所有内容分解成单独的.cpp和.h文件时,我得到了所有这些内容。我应该从哪里开始查找(Object、otherObject或thing),还是从其他地方开始查找。
发布于 2012-01-31 22:16:01
基本上,您在两个转换单元(TU)中定义了thing::thing(args),这违反了一个定义规则(ODR),因此出现了错误。
链接器准确地告诉您涉及哪些TU:otherObject.obj和Object.obj。
开始查看otherObject.cpp和Object.cpp以及这两个cpp文件中包含的头文件。很可能您已经在头文件中定义了构造函数thing::thing(args),并且在这两个cpp文件中都包含该头文件会导致多个定义。
建议的解决方案:
不能在头文件中定义构造函数,需要将其与类的其他成员函数一起添加到cpp文件中。如果您必须将构造函数的定义添加到header中,那么您应该将其标记为inline,因为您还没有展示您的代码,我看不出有任何理由应用第二种方法。
发布于 2012-01-31 22:20:08
根据您问题中的信息,我打赌该方法是在头文件中定义的,而不是内联标记的。这会导致重复的符号链接器错误。尝试将方法标记为内联或将定义移动到源(.C)文件。
https://stackoverflow.com/questions/9080983
复制相似问题