我正在制作一个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)
数据不包含任何内容,一般只包含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几个小时了,这让我发疯了!谢谢!
答案 0 :(得分:1)
首先,检查您是否使用预编译头。如果是,请删除所有预编译的标头。
如果这不起作用,那么我认为this可能会有所帮助。某些版本的g ++中存在一个错误,在一个单元中多次包含一个标题。
看看你是否多次包括Data.h。
预编译标题:查找.gch文件并删除它们。
大型项目通常包含许多源文件中包含的头文件。编译器反复处理这些头文件所花费的时间几乎可以占用构建项目所需的所有时间。为了使构建更快,GCC允许用户“预编译”头文件;那么,如果构建可以使用预编译的头文件,它们会更快。
要创建预编译的头文件,只需像编辑任何其他文件一样编译它,如果需要,使用-x选项使驱动程序将其视为C或C ++头文件。您可能希望使用像make这样的工具,以便在预编译的包含的标题发生变化时使其保持最新状态。
在编译中看到#include时,将搜索预编译的头文件。在搜索包含的文件(请参阅搜索路径)时,编译器会在查找该目录中的包含文件之前在每个目录中查找预编译的头。搜索到的名称是附加了“.gch”的#include中指定的名称。如果无法使用预编译的头文件,则会将其忽略。
例如,如果您有#include“all.h”,并且all.h.gch与all.h在同一目录中,那么将尽可能使用预编译的头文件,原始头将否则使用。