我正在使用 MPLAB IDE 和 XC8 编译器来构建 PIC18 器件的 C 项目。我正在构建一个包含多个源文件的项目,但不知道如何构建结构。
在项目中,我有以下内容:
- 主要代码所在的文件main.c。从这里开始,包括几个文件:
- xc.h:定义芯片特定的变量等
- stdlib.h、stdio.h、plib.h、delays.h:用于编译器的函数
- enc28j60.h:包含定义和原型(prototype)的自制文件
- 一个文件enc28j60.c,其中包含enc28j60.h中原型(prototype)的函数
我无法将 enc28j60.c 编译为独立文件,因为它依赖于 main.c 中的定义。
我对如何设置此项目有几个问题:
- 我应该将 enc28j60.c 添加到 MPLAB 项目的源文件中吗? 如果我这样做,MPLAB 会尝试编译该文件,但会失败。如果我不这样做,链接器将找不到在 enc28j60.c 中定义并在 enc28j60.h 中原型(prototype)化的符号。
- 我应该从某个地方
#include
enc28j60.c 吗? 如果没有,MPLAB 如何知道从哪里获取该文件? - 我应该将 enc28j60.h 添加到 MPLAB 项目的头文件中吗?
- 我应该从某个地方
#include
enc28j60.h 吗?现在,我在 main.c 中执行此操作,在 enc28j60.h 运行所需的定义之后(并且不会抛出#error
)。
最佳答案
我设法通过稍微修改我的库和头文件来使其工作。
首先,我添加了一个文件 main.h,所有原型(prototype)、#define
和 #include
都将存放在其中。然后,在每个 .h
文件中,我在顶部添加了以下内容:
#ifndef SOME_LIB_IDENTIFIER // makes sure the lib only gets included once,
#define SOME_LIB_IDENTIFIER // has to be specific for every lib
#include "main.h" // to make sure everything's initialized (this line of course not in main.h)
每个 .h
文件的最后一行是:
#endif
我将#include "enc28j60.h"
添加到了 enc28j60.c 文件的顶部。现在可以编译该文件了。
在 main.h 中,我添加了 xc.h、plib.h、stdlib.h、stdio.h 和 enc28j60.h 的包含内容。我没有包含 .c
文件。
我将 main 和 enc28j60 头文件和源文件添加到我的 MPLAB 项目中。源文件都编译得很好。结果链接在一起。
简而言之
- 添加一个 main.h,其中包含所有原型(prototype)、
#define
和#include
- 将页眉和页脚添加到所有 header 文件中,以确保它们仅包含一次。还包括这些 header 中的 main.h,以确保每个文件都使用相同的定义
- 在源文件的第一行包含源文件相应的 .h 文件。不要包含 .c 文件
- 将所有头文件和源文件(未内置到编译器中)添加到 MPLAB 项目
- 构建 (F10) 应编译所有文件并将它们正确链接在一起
关于c - 在 MPLAB 中设置具有多个源文件的 C 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16304985/