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;    
}

以前にこのプログラムをすべて 1 つのファイルで作成し、完全に実行しましたが、別のファイルに分割してヘッダーを作成しようとすると、リンカー エラーが発生します。メイン ファイルから実行しようとすると、次のエラーが発生します。

  [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.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

「プロジェクト」に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

@sheuは正しい..しかし、あなたのmain.cppにthing.cppを含めるだけであれば、何もする必要はありませんcpp

于 2013-01-27T12:58:37.430 に答える
0

コンパイラは関数の宣言については知っていますが、定義については何も知りません。彼らがどこにいるかを言う必要があります。これを行う最も簡単な方法は、「プロジェクト」を作成し、すべてのファイルをそれに追加することです。次に、コンパイラはすべてのファイルを検索する場所を認識します。

于 2013-01-27T12:08:52.133 に答える
0

コンパイルされていることを知らせるコードをthing.cppに入れます。

エラー ...

どうやらそれはコンパイルおよびリンクされていません...

于 2013-01-27T14:07:19.277 に答える