在MPLAB中设置包含多个源文件的C项目

时间:2013-04-30 16:43:49

标签: c pic microchip mplab pic18

我将MPLAB IDE和XC8编译器用于PIC18器件的C项目。我正在构建一个包含多个源文件的项目,并且不知道如何制作该结构。

在项目中,我有以下几点:

  • 主代码所在的文件main.c。从这里,包括几个文件:
    • xc.h:定义特定于芯片的变量
    • stdlib.h,stdio.h,plib.h,delays.h:用于编译器的功能
    • enc28j60.h:带有定义和原型的自制文件
  • 文件enc28j60.c,其中enc28j60.h中原型的功能为

我无法将enc28j60.c编译为独立文件,因为它取决于main.c中的定义。

我有一些关于如何设置此项目的问题:

  1. 我应该将enc28j60.c添加到MPLAB项目的源文件中吗? 如果我这样做,MPLAB会尝试编译失败的文件。如果我不这样做,链接器将找不到enc28j60.c中定义的符号并在enc28j60.h中找到原型。
  2. 我应该从某个地方#include enc28j60.c吗? 如果没有,MPLAB如何知道从哪里获取文件?
  3. 我应该将enc28j60.h添加到MPLAB项目的头文件中吗?
  4. 我应该从某个地方#include enc28j60.h吗?现在,我在main.c中执行此操作,之后定义enc28j60.h需要运行(而不是抛出#error s。)

2 个答案:

答案 0 :(得分:2)

我设法通过稍微修改我的库和头文件来实现这一点。

首先,我添加了一个文件main.h,其中所有原型#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,所有原型,#define#include s
  • 在所有头文件中添加页眉和页脚,以确保它们只包含一次。还包括来自这些标头的main.h,以确保每个文件使用相同的定义
  • 在源文件的第一行包含源文件的相应.h文件。不要包含.c文件
  • 将所有头文件和源文件(未编译到编译器中)添加到MPLAB项目
  • Build(F10)应该编译所有文件并将它们正确链接在一起

答案 1 :(得分:1)

请勿包含.c个文件。仅包含标题。如果您要在文件之间共享声明,请将它们放在单独的标题中,并在需要时包含该标题。

编译每个单独的源文件后,将生成的目标文件链接在一起。这涉及在所有源文件上调用编译器,然后在目标文件(带补充库等)上一次性调用链接器。