【问题标题】:Makefile 'fdopen: Bad file descriptor' errorMakefile'fdopen:错误的文件描述符'错误
【发布时间】:2012-06-05 00:55:51
【问题描述】:

我正在制作一个 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 行。先data然后general是依赖在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 卡住了几个小时,它让我发疯了!谢谢!

【问题讨论】:

  • 如果你直接运行g++,而不是通过Makefile,你会得到同样的错误信息吗?

标签: c++ makefile g++


【解决方案1】:

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

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

查看是否多次包含 Data.h。


预编译头文件:查找 .gch 文件并将其删除。

Precompiled header

通常大型项目的每个源文件中都包含许多头文件。编译器一遍又一遍地处理这些头文件所花费的时间几乎可以解释构建项目所需的所有时间。为了加快构建速度,GCC 允许用户“预编译”一个头文件;那么,如果构建可以使用预编译的头文件,它们会更快。

要创建预编译的头文件,只需像编译任何其他文件一样编译它,如有必要,使用 -x 选项使驱动程序将其视为 C 或 C++ 头文件。您可能希望使用 make 之类的工具来使预编译的标头在其包含的标头发生更改时保持最新。

当编译中出现#include 时,将搜索预编译的头文件。当它搜索包含的文件时(请参阅搜索路径),编译器会在每个目录中查找预编译的头文件,然后再在该目录中查找包含文件。搜索的名称是在#include 中指定的名称,并附加了“.gch”。如果预编译的头文件不能使用,则忽略。

例如,如果你有#include "all.h",并且你有all.h.gch和all.h在同一个目录下,那么如果可能的话会使用预编译的头文件,而原始头文件将以其他方式使用。

【讨论】:

  • 我正在使用 。它们是经过编译的标头吗?我怎样才能删除它们(我需要它们)?我不认为我包含 Data.h 多次,因为我正在使用 #ifndef 和 #define 保护我的所有包含。
  • 更新了我定义预编译头文件的答案。
  • 我已经删除了预编译的头文件,但它似乎仍然不起作用。当我在 .h 文件中实现数据的方法时,它会说,错误 - Data::~Data()' in all the other classes. When I move the implementations to a cpp file, it says, multiple definition of Data::~Data()' 的多重定义。任何想法为什么?
  • 您需要在 .cpp 文件中实现。发布 .h 和 .cpp 的新代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多