所以我在基础编程课程中,我们正在学习如何将文件链接在一起。问题是我遇到了一个似乎无法修复的错误。我已经去过我的教授,学生助理和校园的编程辅助实验室,没有运气。
我还在这里搜索了至少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:
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
答案 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
检查输出以查看是否采用了正确的文件