我正在获取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程序员)。至于我对这个问题的有限知识,我只定义了一次,所有内容都只包含一次,所以我个人不知道为什么这些已经定义了。有些请赐教!
答案 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'命令执行此操作。