我制作了以下C ++程序,该程序由3个文件组成:
thing.h文件
#ifndef THING_H
#define THING_H
class thing{
double something;
public:
thing(double);
~thing();
double getthing();
void setthing(double);
void print();
};
#endif
thing.cpp文件
#include <iostream>
#include "thing.h"
thing::thing(double d){
something=d;
}
thing::~thing(){
std::cout << "Destructed" << std::endl;
}
double thing::getthing(){
return something;
}
void thing::setthing(double d){
something = d;
}
void thing::print(){
std::cout <<"The someting is " << something << std::endl;
}
主文件
#include <iostream>
#include "thing.h"
int main(){
thing t1(5.5);
t1.print();
t1.setthing(7.);
double d=t1.getthing();
std::cout << d << std::endl;
system("pause");
return 0;
}
我以前把这个程序全部放在一个文件中并且运行得很好但是当我尝试将它拆分成单独的文件来创建一个头我得到一个链接器错误,这是我从主要运行它时得到的错误文件:
[Linker error] undefined reference to `thing::thing(double)'
[Linker error] undefined reference to `thing::print()'
[Linker error] undefined reference to `thing::setthing(double)'
[Linker error] undefined reference to `thing::getthing()'
[Linker error] undefined reference to `thing::~thing()'
[Linker error] undefined reference to `thing::~thing()'
ld returned 1 exit status
从上面的错误看,虽然主文件无法识别标题内的函数,但我该如何解决?
答案 0 :(得分:1)
您似乎没有将thing.cpp链接到您的“项目”中。
如果您使用gcc进行编译:
g++ thing.cpp -o thing.o
g++ main.cpp -o main.o
g++ main.o thing.o -o my-best-application-ever
如何将文件添加到项目中取决于您使用的编译器/ IDE / build-system。
答案 1 :(得分:1)
略显迂腐:
您的头文件thing.h
声明“class thing
应该是什么样子”,但不是它的实现,它位于源文件thing.cpp
中。通过在主文件中包含标题(我们将其称为main.cpp
),编译器在编译文件时会被告知class thing
的描述,而不是class thing
实际工作的方式。当链接器尝试创建整个程序时,它会抱怨无法找到实现(thing::print()
和朋友)。
解决方案是在创建实际的程序二进制文件时将所有文件链接在一起。使用g ++前端时,可以通过在命令行上同时指定所有源文件来完成此操作。例如:
g++ -o main thing.cpp main.cpp
将创建名为“main”的主程序。
答案 2 :(得分:1)
@sheu是对的..但是如果你只是在main.cpp中包含thing.cpp,你就不必做任何事情。 既然你已经在thing.cpp中包含了thing.h,那么如果包含thing.cpp
,一切都会正常工作答案 3 :(得分:0)
编译器知道函数的声明,但不了解定义。你需要说出它们的位置。最简单的方法是创建“项目”并将所有文件添加到其中。然后编译器知道在哪里搜索所有文件。
答案 4 :(得分:0)
在thing.cpp中放入一些代码,让你知道它正在被编译,即
显然它没有被编译和链接......