C++ 尝试链接.cpp文件时出现多个定义错误(头文件中没有.cpp)

C++ 尝试链接.cpp文件时出现多个定义错误(头文件中没有.cpp),c++,linker,makefile,multiple-definition-error,C++,Linker,Makefile,Multiple Definition Error,所以我在上一堂基础编程课,我们正在学习如何将文件链接在一起。问题是我遇到了一个似乎没有人能解决的错误。我已经去过我的教授、学生助手和校园里的编程辅助实验室,运气不好 我还搜索了至少10篇与多个定义错误相关的帖子,但在每种情况下都是: 试图#包含.cpp文件或 函数定义位于头文件中 正如您所看到的,这两种情况在这里都不适用(我删除了所有注释以使代码更易于阅读): 头文件:square.h: #ifndef SQUARE_H #define SQUARE_H class Square {

所以我在上一堂基础编程课,我们正在学习如何将文件链接在一起。问题是我遇到了一个似乎没有人能解决的错误。我已经去过我的教授、学生助手和校园里的编程辅助实验室,运气不好

我还搜索了至少10篇与多个定义错误相关的帖子,但在每种情况下都是:

  • 试图#包含.cpp文件或

  • 函数定义位于头文件中

  • 正如您所看到的,这两种情况在这里都不适用(我删除了所有注释以使代码更易于阅读):

    头文件:square.h:

    #ifndef SQUARE_H
    #define SQUARE_H
    
    class Square
    {
        private:
                float side;
        public:
                void setSide(float);
                float findArea();
                float findPerimeter();
    };
    
    #endif
    
    函数定义文件:square.cpp

    #include "square.h"
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    void Square::setSide(float length)
    {
      side = length;
    }
    
    float Square::findArea()
    {
      return side * side;
    }
    
    float Square::findPerimeter()
    {
      return 4 * side;
    }
    
    编译命令,仅供参考
    g++test1.cpp square.cpp-o testfile

    使用makefile似乎没有任何区别,我只是看到了完全相同的编译错误。我尝试使用两个不同的makefile:

    生成文件1

    square: test1.cpp square.cpp
            g++ test1.cpp square.cpp -o square
    
    生成文件2

    square: test1.o square.o
            g++ test1.o square.o -o square
    
    test1.o: test1.cpp
            g++ -c test1.cpp
    
    square.o: square.cpp
            g++ -c square.cpp
    
    现在我只知道这是某种链接器错误,但我不知道该怎么办。我问过的每个人都说我的代码是正确的。但显然有些地方出了问题


    任何帮助都将不胜感激我想这可能会有所帮助

    按如下方式尝试生成文件:

    square: test1.o square.o
            g++ test1.o square.o -o square
    
    test1.o: test1.cpp square.h
            g++ -c test1.cpp
    
    square.o: square.cpp square.h
            g++ -c square.cpp
    
    编辑 如果不起作用,请尝试仅运行预处理:

    g++ -E test1.cpp
    


    检查输出以查看是否使用了正确的文件

    我想这可能会有所帮助

    按如下方式尝试生成文件:

    square: test1.o square.o
            g++ test1.o square.o -o square
    
    test1.o: test1.cpp square.h
            g++ -c test1.cpp
    
    square.o: square.cpp square.h
            g++ -c square.cpp
    
    编辑 如果不起作用,请尝试仅运行预处理:

    g++ -E test1.cpp
    


    检查输出以查看是否使用了正确的文件

    正常。创建一个新的、干净的目录,并将代码复制/粘贴到新文件中(使用与旧文件相同的文件名),使其能够最终编译。出于某种原因,我想编译器只是不喜欢我的旧文件。

    好的。创建一个新的、干净的目录,并将代码复制/粘贴到新文件中(使用与旧文件相同的文件名,允许它最终编译。出于某种原因,我想编译器只是不喜欢我的旧文件。

    检查“愚蠢”素材:你是在一个目录中查看代码,然后在另一个目录中编译吗?
    cat
    检查文件是否真的包含你认为的内容。创建一个新目录,只复制上面的文件,然后再次尝试编译它们……当链接行顺序不正确时,缺少的定义会更加突出;而不是多个。打开我想我会改变你的链接行,首先是把
    -o-square
    放在第一位,但这不应该改变你的结果。这段代码在我的装备上按预期工作和构建,因此你可能在分解
    square
    代码和头之前的某个地方有过时的内容。你的编译顺序是什么?
    g++test1.cpp square.cpp-o square&&make#Makefile2对我来说很有用。没有变化。但对你来说很有趣。现在我在Unix环境中编译,在不同的环境中编译有什么简单的方法?你上次看到这些错误之前或之后删除了所有注释吗?换句话说,你是在你给我们看的代码是什么?检查“愚蠢”素材:你是在一个目录中查看代码,然后在另一个目录中编译吗?
    cat
    检查文件是否真的包含你认为的内容。创建一个新目录,只复制上面的文件,然后再次尝试编译它们……当链接行顺序不正确时,缺少的定义会更加突出;而不是多个。打开我想我会改变你的链接行,首先是把
    -o-square
    放在第一位,但这不应该改变你的结果。这段代码在我的装备上按预期工作和构建,因此你可能在分解
    square
    代码和头之前的某个地方有过时的内容。你的编译顺序是什么?
    g++test1.cpp square.cpp-o square&&make#Makefile2对我来说很有用。没有变化。但对你来说很有趣。现在我在Unix环境中编译,在不同的环境中编译有什么简单的方法?你上次看到这些错误之前或之后删除了所有注释吗?换句话说,你是在你给我们看的代码是什么?
    
    g++ -E square.cpp