代码之家  ›  专栏  ›  技术社区  ›  Rich khmarbaise

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

  •  1
  • Rich khmarbaise  · 技术社区  · 17 年前

    在Visual Studio 2008中生成项目时,我得到的lnk2005:已在(…)错误中定义。我已经提到了其他相关的问题,但是我的问题似乎有点复杂,因为如果没有其他的问题的话,那就是我正在处理的文件的数量。

    首先,我认为以[当前文件]->包含此文件的格式绘制项目文件中的include语句对我有帮助。

    我的所有头文件都使用标准的ifndef[头]define[头]……第二节。

    [调制器]

    调制器类原型

    [chorusunit.h]->调节器.h

    具有类型调制器成员对象的合唱类原型

    [audiohandler.h]—>chorusunit.h

    具有合唱类成员对象的AudioHandler类的原型

    [chorus.cpp]->音频处理程序.h

    调音员和合唱团成员的定义

    [audiohandler.cpp]->chorus.cpp

    audiohandler类成员的定义

    [chorusunit.cpp]->audiohandler.cpp

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

    include的排序是因为modulator.h、chorusunit.h和audiohandler.h中的类的所有函数定义都需要引用其他类的成员,所以我需要首先定义原型,以便所有类都能看到彼此。

    错误特别指出,在chorus.cpp和audiohandler.cpp文件chorus.obj中找到的每个定义都已经在audiohandler.obj中定义。 另外还有一组相同的错误类型,表示在chorus.cpp和audiohandler.cpp文件chorusunit.obj中找到的每个定义都已在audiohandler.obj中定义。

    可能有一个非常简单的解决方案,但我并不是特别有经验(主要是Java程序员)。就我对这一主题的有限知识而言,我只定义了一次所有的东西,而所有的东西都只包含了一次,所以我个人对于这些东西为什么已经被定义感到茫然。有人请开导我!

    4 回复  |  直到 17 年前
        1
  •  9
  •   jpalecek    17 年前

    错误可能是你说你在audiohandle.cpp中包含chorus.cpp-这不是你想要的。

    原因是,所有的.cpp文件(除非您在IDE中做了一些特殊的事情)都是单独编译的,然后链接起来的。当您包含另一个.cpp文件时,该文件的文本将从字面上包括在内;因此,包含文件中定义的所有对象也将显示在包含文件中。当链接这两个文件时,公共对象会导致冲突。

        2
  •  3
  •   dirkgently    17 年前

    [audiohandler.cpp]->chorus.cpp

    audiohandler类成员的定义

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

        3
  •  2
  •   rkb    17 年前

    AudioHANDLR.CPP和CuluUnIt.CPP应该只包含头文件,而不是其他C++源文件。

    预处理器将任何包含文件的内容插入到包含文件中,因此一旦开始链接,您将从chorus.cpp获得两个符号副本:一个来自编译chorus.cpp,另一个来自编译audiohandler.cpp(因为它包含chorus.cpp)。

        4
  •  0
  •   drarc    17 年前

    我不知道如何在Windows机器上实现这一点,但是这些问题通常可以通过只通过C预处理器运行代码来解决。这将导致一个合并的源文件,基本上用它们引用的文件替换所有的“include”语句。如果您查看这个组合文件,那么在重新定义东西的地方会变得很明显。在Linux/Unix中,您可以使用'cpp'命令来执行此操作。