所以我在上一个基本的编程课,我们正在学习如何将文件链接在一起。问题是我遇到了一个似乎没有人能够修复的错误。我已经去过我的教授、学生助理和校园里的编程辅助实验室,但运气不好。
我还在这里搜索了至少 10 篇与多个定义错误有关的不同帖子,但在每种情况下都是:
尝试#include .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;
}
程序文件: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