1

我制作了以下由 3 个文件组成的 C++ 程序:

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  

从上述错误看来,主文件似乎无法识别标题中的函数,请问我该如何解决?

4

5 回答 5

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/构建系统。

于 2013-01-27T12:08:27.173 回答
1

用稍微不那么迂腐的术语来说:

您的头文件thing.h声明了“class thing应该是什么样子”,但没有声明它的实现,它在源文件thing.cpp中。通过在主文件中包含头文件(我们称之为main.cpp),编译器会被告知class thing编译文件时的描述,而不是class thing实际工作方式。当链接器尝试创建整个程序时,它会抱怨thing::print()找不到实现(和朋友)。

解决方案是在创建实际程序二进制文件时将所有文件链接在一起。使用 g++ 前端时,您可以通过在命令行上同时指定所有源文件来做到这一点。例如:

g++ -o main thing.cpp main.cpp

将创建名为“main”的主程序。

于 2013-01-27T12:22:35.930 回答
1

@sheu 是对的.. 但是,如果您只在 main.cpp 中包含 thing.cpp,则无需执行任何操作因为您已经在 thing.cpp 中包含了 thing.h,如果您包含了 thing,一切都会正常工作。 cpp

于 2013-01-27T12:58:37.430 回答
0

编译器知道函数的声明,但对定义一无所知。你需要告诉他们他们在哪里。最简单的方法是创建“项目”并将所有文件添加到其中。然后编译器知道在哪里搜索所有文件。

于 2013-01-27T12:08:52.133 回答
0

在 thing.cpp 中放一些代码,让你知道它正在被编译,即

错误 ...

显然它没有被编译和链接......

于 2013-01-27T14:07:19.277 回答