c - 在 MPLAB 中设置具有多个源文件的 C 项目

标签 c pic microchip mplab pic18

我正在使用 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 中的定义。

我对如何设置此项目有几个问题:

  1. 我应该将 enc28j60.c 添加到 MPLAB 项目的源文件中吗? 如果我这样做,MPLAB 会尝试编译该文件,但会失败。如果我不这样做,链接器将找不到在 enc28j60.c 中定义并在 enc28j60.h 中原型(prototype)化的符号。
  2. 我应该从某个地方#include enc28j60.c 吗? 如果没有,MPLAB 如何知道从哪里获取该文件?
  3. 我应该将 enc28j60.h 添加到 MPLAB 项目的头文件中吗?
  4. 我应该从某个地方#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/

相关文章:

windows - PIC 18 Controller 作为串行以太网桥

c - 整数显示为ascii?

assembly - PIC单片机中的银行切换

c - 为什么在乘法中使用 long int 会产生一个奇怪的数字?

c - 为什么 Timer1 不在 PIC18 上计数?

embedded - 如何使Timer1作为实时时钟更准确?

c - __builtin_dmaoffset() 的参数不是 dma 节中对象的地址;

c - 程序存储器中的 Hitech C 数据缓冲区

c - 中缀到后缀函数错误 : control may reach end of non-void function

c - 如何以可读的方式使用 C 初始化寄存器中的位