C++ 尝试链接.cpp文件时出现多个定义错误(头文件中没有.cpp)
所以我在上一堂基础编程课,我们正在学习如何将文件链接在一起。问题是我遇到了一个似乎没有人能解决的错误。我已经去过我的教授、学生助手和校园里的编程辅助实验室,运气不好 我还搜索了至少10篇与多个定义错误相关的帖子,但在每种情况下都是: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 {
#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