我正在用C做一个项目,我在构建它时遇到了问题。它是:
我的项目中有两个独立的子系统[A和B],它们使用另一个子系统[C]的功能。为此,他们#include必要的头文件。我们的义务是必须单独构建子系统[A和B],我的意思是我有两个独立的'Makefile'用于子系统,我分别运行'make'。
现在,当我尝试将所有子系统[A,B,C]统一到一个项目中时,gcc告诉我们已经声明了一些函数并且这些函数属于子系统C.
我意识到头文件包含在编译时,即当我在子系统[A和B]上使用'make'时。因此,当我试图将所有这些联合起来时,它们实际上是双重声明的。
有人可以帮我解决这个问题吗?任何不需要我同时编译子系统[A和B]的解决方案都会很好。
答案 0 :(得分:3)
这是编译错误或链接器错误。
如果是编译时错误,您需要在.h文件中使用一些包含警戒,如下所示:
#ifndef FILE_NAME_H #define FILE_NAME_H // file contents here #endif
这将停止多次包含文件。更改FILE_NAME_H以反映文件名,以便每个包含后卫都是唯一的。
如果是链接时错误,这通常发生在头文件中有函数体(即{}
)时。因为多个文件将包含标头,所以每个文件在目标代码中都有自己的定义,这将导致链接器冲突。
解决此问题的最佳方法是简单地确保所有函数体都放在.c文件中。如果它们足够短,你可以尝试__inline__
,但编译器不能保证听你的。
答案 1 :(得分:0)
您可以使用#ifndef ..
来避免双重包含头文件
#ifndef <some name identifying the header file>
#define <some name identifying the header file>
//
//
// header file content will go here
//
//
#endif
答案 2 :(得分:0)
您的C头文件是仅包含声明还是实现?
如果它包含实现,那么你应该将其取出并单独编译。