0

所以为了简化,假设我有一个 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()' 的引用”错误。

那么为什么我的 include 对结构起作用,而不是对函数起作用呢?如果有什么不同,我的 gcc 是 gcc(SUSE Linux) 4.6.2

4

2 回答 2

0

它之所以有效,是因为标头包含结构的声明,但函数的代码在 C 文件中。您需要将已编译的 C 文件(称为“目标文件”)链接在一起。

例如,将“Page.c”编译为“Page.h”,然后在构建“Test.c”时,将其与“Page.o”链接,因为需要该模块的功能。

在 C 中,仅仅因为您#include "something.h"在 C 文件中,编译器不会自动知道如何找到在标头中声明的事物的定义(例如任何函数或外部变量)。

#include编译器只看到标题的文本,基本上是粘贴到发生的地方。它没有找到代码的神奇方法。您甚至可能没有相应的 C 文件,因为 C 支持分发二进制文件,即预编译库。

于 2014-02-11T19:27:47.277 回答
0

我最好的猜测是,您没有在包含 printPage() 的模块中进行链接。

编译模块时,编译器仅根据标头知道存在什么。结构的布局可以从标题中获知,但函数的内容是未知的。

当您的应用程序被链接时,您必须确保在其中包含该其他模块。或者,使 printPage() 成为内联函数。

于 2014-02-11T19:32:52.527 回答