微控制器的模块化编程

时间:2013-01-29 21:11:33

标签: c embedded

我正在开发一个全面的长期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);
...

以下是您绘制的基本网络图:

diagram

因为force.cmeasure.c都包含godzilla.h,所有内容都将从此头文件中引用并包含在编译过程中,是否正确?

修改

应用程序:ARM微处理器

3 个答案:

答案 0 :(得分:2)

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

通常在编译时创建带有一些未解析引用的目标文件,链接器将解析这将创建二进制文件。 其中一些引用可以指向外部库,并且将保留未解析的#34;并将在运行时解决。

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

一般来说,在开始编写C库之前,你应该很好地理解这些概念,否则你会创建一个糟糕的库,它会在每个次要版本中改变ABI,并且会产生不良的业力。

答案 1 :(得分:0)

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

为了创建一个库,您需要明确告诉您希望放入哪些编译文件(.obj / .o),链接器无论头部如何都会创建库。

如果不同的.obj文件共享数据或相互调用,则链接会在链接时发挥作用,但没有任何隐含的内容。

答案 2 :(得分:0)

所有头文件都告诉编译器可以使用哪些函数以及如何调用它们(有多少类型的参数和返回值)。

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