我应该如何在c文件中包含使用extern定义的变量

时间:2016-06-26 00:19:17

标签: c arm stm32f4discovery ar

我无法使用arm-none-eabi工具链编译STM32F4-Discovery的演示代码。链接中出现错误,这是我收到的[第一个]错误。

template/obj/stm32f4xx_it.o: In function `OTG_FS_IRQHandler':
template/src/stm32f4xx_it.c:192: undefined reference to `hpcd'

我一直试图将这个问题打开和关闭几个月,所以我创建了this github存储库来跟踪项目。变量hpcdtemplate/src/usbd_conf.c中定义。不幸的是,我对C / C ++的了解很多,所以我希望有人可以帮助我缩小问题的范围,并提出正确的解决方法。

我有两个问题。

  1. hpcd包含在文件usbd_conf.c中。它在许多文件中使用,但这些文件实际上都不包含usbd_conf.c,仅包含usbd_conf.h。问题是,只包含标题,声明变量为extern PCD_HandleTypeDef hpcd;的文件是否可以使用变量而不包含.c文件?
  2. 假设问题1的答案是肯定的,为什么函数OTG_FS_IRQHandler没有找到hpcd?来自stm32f4xx_it的包含链是main.h -> usbd_core.h -> usbd_conf.h
  3. 我假设问题1的答案是肯定的,因为这是我购买时我认为在电路板上运行的演示代码。我只能假设这个问题与我正在构建它的方式有关。有人愿意帮我解决这个问题吗?我很乐意提供更多相关细节或更好地构建这个问题,但我试图避免在我的问题中发布完整的USB堆栈。谢谢。

1 个答案:

答案 0 :(得分:2)

如果您将extern PCD_HandleTypeDef hpcd;放入其中所有相关人员所包含的标题中(main.h会这样做,我认为)会有所帮助。

extern内容如何正常工作的示例:

确定要在别处使用的变量的文件包含

include "a_header.h";
// ...
int some_variable = 42;

标题a_header.h包含

extern some_variable;

您要使用该变量的文件包含

include "a_header.h";
extern some_variable;
//...
foo = some_variable;
some_variable = 47;

这样链接器就会知道如何处理它。