首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >追踪LNK2005:“已定义”

追踪LNK2005:“已定义”
EN

Stack Overflow用户
提问于 2012-01-31 22:13:26
回答 2查看 826关注 0票数 1

我一直在做windows VC++ 2008中的一个程序。一开始,我将所有代码放在.cpp文件中(只是为了让一切正常工作),现在将代码分解成.h和.cpp文件。当我编译时,我得到了堆积如山的LNK2005错误,说明:

代码语言:javascript
复制
Object.obj : error LNK2005: "__thiscall thing::thing(args)" already defined in otherObject.obj

当我编写原始程序时,我不断收到未声明标识符的错误,因此我给出了一个include指令来满足这一要求。现在,当我将所有内容分解成单独的.cpp和.h文件时,我得到了所有这些内容。我应该从哪里开始查找(Object、otherObject或thing),还是从其他地方开始查找。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-31 22:16:01

基本上,您在两个转换单元(TU)中定义了thing::thing(args),这违反了一个定义规则(ODR),因此出现了错误。

链接器准确地告诉您涉及哪些TU:otherObject.objObject.obj

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

建议的解决方案:

不能在头文件中定义构造函数,需要将其与类的其他成员函数一起添加到cpp文件中。如果您必须将构造函数的定义添加到header中,那么您应该将其标记为inline,因为您还没有展示您的代码,我看不出有任何理由应用第二种方法。

票数 3
EN

Stack Overflow用户

发布于 2012-01-31 22:20:08

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9080983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档