复杂错误LNK2005:已经定义了C ++

时间:2009-04-06 19:56:45

标签: c++ visual-studio-2008 linker

我正在获取LNK2005:在Visual Studio 2008中构建我的项目时已经在(...)错误中定义。我已经引用了其他相关问题,但是由于没有别的东西,我似乎有点复杂了我正在使用的文件数量。

首先,我认为以格式[current_file] - > includes_this_file

格式化我项目文件中的#include语句会很有帮助。

所有标题文件都使用标准#ifndef [标题] #define [标题] ... #endif保护。

[Modulator.h]

Modulator类的原型

[ChorusUnit.h] - > Modulator.h

具有Modulator

类型成员对象的Chorus类的原型

[AudioHandler.h] - > ChorusUnit.h

AudioHandler类的原型,它具有Chorus类的成员对象

[Chorus.cpp] - > AudioHandler.h

调制器和合唱类成员的定义

[AudioHandler.cpp] - > Chorus.cpp

AudioHandler类成员的定义

[ChorusUnit.cpp] - > AudioHandler.cpp

包含实际运行项目代码的main()函数的文件。

包含的顺序是因为在Modulator.h,ChorusUnit.h和AudioHandler.h中找到的类的所有函数定义都需要引用其他类的成员,因此我需要首先为所有类定义的原型班级互相见到。

该错误明确指出在Chorus.obj文件中的Chorus.cpp和AudioHandler.cpp中找到的每个定义都已在AudioHandler.obj中定义。 还有另一组相同的错误类型,表示在Chorus.cpp中找到的每个单一定义,文件ChorusUnit.obj中的AudioHandler.cpp已在AudioHandler.obj中定义。

可能有一个非常直接的解决方案,但我并不是特别经验(主要是Java程序员)。至于我对这个问题的有限知识,我只定义了一次,所有内容都只包含一次,所以我个人不知道为什么这些已经定义了。有些请赐教!

4 个答案:

答案 0 :(得分:9)

错误可能是你在AudioHandle.cpp中说#include Chorus.cpp - 这不是你想要的。

原因是,所有.cpp文件(除非您在IDE中执行了一些特殊操作)都是单独编译的,然后是链接的。当你#include另一个.cpp文件时,字面上包含文件的文本;因此,包含文件中定义的所有对象也会出现在包含文件中。链接这两个文件时,常见对象会导致冲突。

答案 1 :(得分:3)

  

[AudioHandler.cpp] - > Chorus.cpp

     

AudioHandler类成员的定义

这是错误的。包含ChorusUnit.hpp原型。

答案 2 :(得分:2)

AudioHandler.cpp和ChorusUnit.cpp只应该#include头文件,而不是其他C ++源文件。

预处理器将任何#included文件的内容插入到#including文件中,因此一旦开始链接,就会从Chorus.cpp获得两个符号副本:一个来自编译Chorus.cpp,另一个来自编译AudioHandler.cpp (因为它#includes Chorus.cpp)。

答案 3 :(得分:0)

我不确定如何在Windows机器上执行此操作,但通常只能通过C预处理器运行代码来解决这些问题。这将导致组合的源文件基本上用它们引用的文件替换所有“#include”语句。如果您查看此组合文件,则可以明显重新定义事物。在Linux / Unix中,您可以使用'cpp'命令执行此操作。