0

我正在从事一个需要模块化编程方法的综合性长期 C 编程项目。作为设计的一部分,将创建库,因此我想确认对头文件组织的正确/错误解释:

问题

假设您正在创建一个库。仔细考虑之后,您已经决定要构想的最终库,也就是“godzilla”,应该由绑定到头文件的两个单独的 C 文件组成。在这个头文件中将存在函数声明;例如:

// offense.c
void attack_city(uint32_t force);    // (in Newtons) - capable of a LOT of force!
...

// measure.c
void measure_effect(void);
...

这是您绘制的基本网络图:

图表

因为 bothforce.cmeasure.cincludes godzilla.h,所以一切都会从这个头文件中引用并包含在编译过程中,对吗?

编辑

应用:ARM微处理器

4

3 回答 3

2

您应该熟悉链接的工作原理。

通常,当您编译时,您会创建带有一些未解析引用的目标文件,这些引用将由链接器解析,从而创建二进制文件。其中一些引用可以指向外部库,并且将“未解析”并在运行时解析。

头文件只是为编译器提供了函数的签名(没有提供有关在哪里找到实际实现的信息),因此它将知道如何将参数传递给函数。如果该函数未在同一模块中定义,则链接器将需要找到它。我不知道您使用的是哪个系统,所以我无法帮助您。

一般来说,在开始编写 C 库之前,您应该非常了解这些概念,否则您将创建一个糟糕的库,该库会在每个次要版本中更改 ABI,并且会因此产生不好的业力。

于 2013-01-29T21:24:46.030 回答
1

头文件所做的只是告诉编译器哪些函数可用以及应该如何调用它们(哪些类型的参数有多少,以及返回值)。

它是链接器(或库管理员,在创建库而不是可执行文件时)带来了编译每个 .c 文件所产生的多个目标文件。因此,您需要告诉编译器(例如在命令行上,通过 IDE 或 Makefile)您希望它编译的所有 c 文件。

于 2013-01-30T12:56:36.670 回答
0

标头和 .lib 文件之间没有隐式“绑定”

为了创建一个库,您需要明确告知您希望放入哪些编译文件(.obj/.o),链接器会创建库而不考虑标题。

如果不同的 .obj 文件共享数据或相互调用,则在链接时标题确实会发挥作用,但这并没有隐含的意义。

于 2013-01-29T23:10:57.840 回答