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

时间:2013-10-30 23:28:57

标签: c++ linker makefile multiple-definition-error

所以我在基础编程课程中,我们正在学习如何将文件链接在一起。问题是我遇到了一个似乎无法修复的错误。我已经去过我的教授,学生助理和校园的编程辅助实验室,没有运气。

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

  1. 尝试#include .cpp文件或

  2. 函数定义位于头文件中。

  3. 这些情况都不适用于此,正如您所看到的(我删除了所有注释以使代码更易于阅读):

    头文件: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;
    }
    

    程序文件:test1.cpp

    #include "square.h"
    #include <iostream>
    
    using namespace std;
    
    
    int main()
    {
        Square  box;
        float   size;
    
            cout << "\n\nHow long is a side of this square?: ";
            cin >> size;
    
            box.setSide(size);
    
            cout << "\n\nThe area of the square is " << box.findArea();
    
            cout << "\n\nThe perimeter of the square is " << box.findPerimeter();
    
            cout << endl << endl;
    
            return 0;
    }
    

    每当我尝试编译时最终出现错误:

    /tmp/ccVaTqTo.o: In function `Square::setSide(float)':
    square.cpp:(.text+0x0): multiple definition of `Square::setSide(float)'
    /tmp/cc4vruNq.o:test1.cpp:(.text+0x0): first defined here
    /tmp/ccVaTqTo.o: In function `Square::findArea()':
    square.cpp:(.text+0xe): multiple definition of `Square::findArea()'
    /tmp/cc4vruNq.o:test1.cpp:(.text+0xe): first defined here
    /tmp/ccVaTqTo.o: In function `Square::findPerimeter()':
    square.cpp:(.text+0x20): multiple definition of `Square::findPerimeter()'
    /tmp/cc4vruNq.o:test1.cpp:(.text+0x20): first defined here
    collect2: ld returned 1 exit status
    

    编译命令,仅供参考g++ test1.cpp square.cpp -o testfile

    使用makefile似乎没有任何区别,我最后只是盯着完全相同的编译错误。我尝试过使用两种不同的makefile:

    Makefile 1

    square: test1.cpp square.cpp
            g++ test1.cpp square.cpp -o square
    

    Makefile 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
    

    现在我所知道的是这是某种链接器错误,但我不知道如何处理它。我问的每个人都说我的代码是正确的。但显然有些错误。

    非常感谢任何帮助。 :d

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

我想也许这可以帮助

尝试makefile如下:

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

g++ -E square.cpp

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