0

我正在制作一个makefile,并收到此错误:

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 行。数据,然后是一般是在makefile中写入依赖项的顺序:

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 文件。以上所有方法均无效。请帮忙 - 我已经被这个 makefile 困了几个小时了,这让我发疯了!谢谢!

4

1 回答 1

1

首先,检查您是否使用了预编译的头文件。如果是这样,请删除所有预编译的标头。

如果这不起作用,那么我认为可能会有所帮助。某些版本的 g++ 中存在一个错误,即在一个单元中多次包含标头。

看看你是否多次包含 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 回答