0

私はメイクファイルを作成していますが、次のエラーが発生します。

List.h:10:18: error: calling fdopen: Bad file descriptor

なぜそれが起こるのか分かりません。List.h の冒頭は次のとおりです。

#ifndef List_h__
#define List_h__

#include "Data.h"
#include "general.h"

#include "Data.h" は 10 行目です。データ、次に一般は、依存関係がメイクファイルに書き込まれる順序です。

List.o: List.cpp List.h Data.h general.h
    g++ List.cpp $(f)

data には何も含まれず、general には iostream のみが含まれ、他のクラスには iostream も含まれません。

Data.h は次のとおりです。

#ifndef Data_h__
#define Data_h__

class Data
{
private:
public:
    //default constructor
    Data() {}
    //destructor
    virtual ~Data()=0;
    /*****************************************************************************
    * function name: operator<
    * The Input: This Data, other Data
    * The output: The operator will compare between two datas. The comparison will
    * be used to create a sorted list.
    *****************************************************************************/
    virtual bool operator<(const Data& other) const =0;
};

Data::~Data() {}

#endif //Data_h__

私は最初、=0 の後に Data のデストラクタの簡単な実装を行いました。また、コンストラクタとデストラクタの簡単な実装を .cpp ファイルに移動しようとしました。上記のすべてが機能しませんでした。助けてください - このメイクファイルで何時間も立ち往生していて、気が狂いそうです! ありがとう!

4

1 に答える 1

1

まず、プリコンパイル済みヘッダーを使用しているかどうかを確認します。その場合、すべてのプリコンパイル済みヘッダーを削除します。

それでうまくいかない場合は、これが役立つかもしれないと思います。g++ の一部のバージョンには、1 つのユニットにヘッダーを複数回含めるというバグがあります。

Data.h を複数回インクルードしているかどうかを確認します。


プリコンパイル済みヘッダー: .gch ファイルを探して削除します。

プリコンパイル済みヘッダー

多くの場合、大規模なプロジェクトには、すべてのソース ファイルに含まれる多数のヘッダー ファイルがあります。コンパイラがこれらのヘッダー ファイルを何度も処理するのにかかる時間は、プロジェクトのビルドに必要な時間のほぼすべてを占める可能性があります。ビルドを高速化するために、GCC ではユーザーがヘッダー ファイルを「プリコンパイル」することができます。次に、ビルドがプリコンパイル済みヘッダー ファイルを使用できる場合、ビルドははるかに高速になります。

プリコンパイル済みヘッダー ファイルを作成するには、他のファイルと同じようにコンパイルします。必要に応じて -x オプションを使用して、ドライバーが C または C++ ヘッダー ファイルとして扱うようにします。プリコンパイル済みヘッダーに含まれるヘッダーが変更されたときに、そのヘッダーを最新の状態に保つために、make などのツールを使用することをお勧めします。

#include がコンパイルに含まれている場合、プリコンパイル済みヘッダー ファイルが検索されます。インクルード ファイルを検索するとき (「検索パス」を参照)、コンパイラは各ディレクトリでプリコンパイル済みヘッダーを検索してから、そのディレクトリでインクルード ファイルを検索します。検索される名前は、#include で指定された名前に `.gch' が追加されたものです。プリコンパイル済みヘッダー ファイルが使用できない場合は、無視されます。

たとえば、#include "all.h" があり、all.h.gch が all.h と同じディレクトリにある場合、可能であればプリコンパイル済みヘッダー ファイルが使用され、それ以外の場合は元のヘッダーが使用されます。 .

于 2012-06-04T16:45:40.240 に答える