为了简化,假设我有一个带有以下内容的Page.h文件......
#ifndef PAGE_H
#define PAGE_H
typedef struct Pgmap{
int test;
}Page;
void printPage();
#endif
Page.c定义printPage()并具有...
#include "Page.h"
而且,我有另一个使用上面结构/函数的.c / .h文件。
在Test.h中我......
#include "Page.h"
,我的Test.c已经
#include "Test.h"
此时我可以使用我的Page结构,但是当我尝试使用printPage()时,在尝试编译时,我得到一个“未定义的'printPage()'错误引用。
那么为什么我的包括结构的工作,而不是函数?如果它有所不同,我的gcc是gcc(SUSE Linux)4.6.2
答案 0 :(得分:0)
它的工作原理是头部包含结构的声明,但函数的代码在C文件中。您需要将已编译的C文件(称为“对象文件”)链接在一起。
例如,将“Page.c”编译为“Page.h”,然后在构建“Test.c”时,将其与“Page.o”链接起来,因为需要该模块的功能。
在C中,只是因为你的C文件中有#include "something.h"
,编译器不会自动知道如何找到标题中声明的事物的定义(例如任何函数或外部变量)。
编译器只看到标题的文本,基本上粘贴到#include
发生的位置。找到代码没有神奇的方法。您可能甚至没有拥有相应的C文件,因为C支持分发二进制文件,即预编译的库。
答案 1 :(得分:0)
我最好的猜测是,你没有链接到包含printPage()的模块。
编译模块时,编译器只根据标头知道存在的内容。从头文件中可以知道结构的布局,但函数的内容是未知的。
在链接应用程序时,您必须确保包含其他模块。或者,使printPage()成为内联函数。