C++ C++-未定义的参考错误,即使应包含的文件在同一文件夹中

C++ C++-未定义的参考错误,即使应包含的文件在同一文件夹中,c++,reference,include,undefined,C++,Reference,Include,Undefined,我有一个问题,一些代码,这是分布在不同的文件。 我有一个main.cpp,在这里调用方法。在main.cpp中,我包含了一个“deklaorationen.h”,它声明了带有签名的方法。例如void“average(float,float&);” 此方法的主体位于“average.cpp”中。但是,当我试图编译main.cpp时,我得到了以下错误代码“\main.o:main.cpp | |未定义对`average(float,float&')的引用” 所有文件都在同一个目录中,正如我所说,我将

我有一个问题,一些代码,这是分布在不同的文件。 我有一个main.cpp,在这里调用方法。在main.cpp中,我包含了一个“deklaorationen.h”,它声明了带有签名的方法。例如void“average(float,float&);”

此方法的主体位于“average.cpp”中。但是,当我试图编译main.cpp时,我得到了以下错误代码“\main.o:main.cpp | |未定义对`average(float,float&')的引用”

所有文件都在同一个目录中,正如我所说,我将头文件包括在main.cpp中

提示:我正在将Code::Blocks与ming32 gpp编译器一起使用

我是做错了什么,还是编译器错误或smth

问候

代码: Main.cpp

代码:average.cpp(仍为同一文件夹)


编译C++代码时,会发生以下(简化)步骤:

  • 预编译(替换包含、宏..)
  • 对象文件生成
  • 链接
  • 第1步工作正常,否则您将收到一个命令错误。您对步骤2或步骤3或两者都有问题。“undefined reference”错误意味着链接器找不到对方法编译版本的引用

    首先,您应该检查是否正在生成所有对象文件。您可以通过查看编译器输出并查看是否看到任何消息(如g++文件名)来判断这一点。。文件名为.o,或者通过查看构建目录,查看您拥有的每个*.cpp文件是否都有一个*.o文件

    最后一步是链接,链接器将所有.o文件连接到一个可执行文件中

    我不使用代码块,但您的问题可能是需要指示代码块将包含缺少引用的文件包含到构建中

    或者,您可以手工编写makefile、学习cmake或从命令行编译,所有这些都是有用的技能

    我看到您发布了代码块正在执行的构建命令:


    “mingw32-g++.exe-c main.cpp-o main.o”“mingw32-g++.exe-o main.exe main.o”


    这里只编译main,不编译或链接其他文件。

    是否编译了
    average.cpp
    ?或者更好:共享您正在运行的构建命令。“mingw32-g++.exe-c main.cpp-o main.o”“mingw32-g++.exe-o main.exe main.o”是我的IDE正在执行的构建命令PS:@πάνταῥεῖ 我想我知道一般的未定义引用是什么。但我不知道为什么他不能链接同一文件夹中的文件。@user3679491“我想我知道一般的未定义引用是什么”显然不是!你没有编译和链接
    average.cpp
    。不管它是否在同一文件夹中,都没有问题自动sed到编译器/链接器。@πάνταῥεῖ 我说了“我想”,然后对此我真的很抱歉。问题是,平均方法使用的是全局变量a,目前无法编译。当我包括“dekladerationen.h“对于变量a,它向'WinMain@16'因为它没有main方法。@user3679491
    mingw32-g++.exe-c main.cpp average.cpp-o main.o
    应该能做到这一点。完全正确。我自己认为是链接造成了麻烦,因为我对每个.cpp文件都有一个对象文件。正如我所说的,它曾经起作用。但不知怎的,它没有联系起来。(当我尝试编译一个只使用1.cpp的不同代码时,一切都很好)我甚至尝试重新安装code::blocks来重新安装内置的链接器/编译器,因为,正如我所说的。这是我试图
    mingw32-g++.exe-o main.exe main.o average.o differencez.o einlesen.o produkt.o quotient.o summe.o时的错误代码。我查看了你的编译命令,它没有生成main.o以外的任何.o文件。引号中的第一行生成main.o,第二行表示将main.o转换为可执行文件。它还应该在要链接的.o文件列表中包含average.o。在发布的命令中,average.o既不编译也不链接。这表明您以前在构建中使用average.cpp,现在不再使用。尝试一个干净的构建,看看是否能重新生成average.o。根据您的描述,我猜您的构建目标列表中有average.cpp,现在不再有了。
    
    #include "deklarationen.h"
    #include <iostream>
    using namespace std;
    int main ()
    {
    //body of the function
    average(b,mittel);
    }
    
    #ifndef _DEKLARATIONEN_H_
    #define _DEKLARATIONEN_H_
    float a;
    void einlesen(float &a, float &b);
    void average(float, float &avg);
    void quotient(float, float&);
    void produkt(float b, float& quot);
    float summe(float);
    extern float differenz(float);
    
    #endif  /* _DEKLARATIONEN_H_ */
    
    void average(float b,float &avg)
    {
        avg = (a+b)/2;
    }