1

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

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

  1. 尝试#include .cpp 文件或

  2. 函数定义在头文件中。

如您所见,这些情况都不适用于此处(我已删除所有注释以使代码更易于阅读):

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

生成文件 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

现在我只知道这是某种链接器错误,但我不知道该怎么做。我问过的每个人都说我的代码是正确的。但显然有些事情是错误的。

任何帮助将不胜感激。:D

4

2 回答 2

4

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

于 2013-10-31T13:08:20.900 回答
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

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

于 2013-10-30T23:58:06.607 回答