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

How should I include variable defined with extern in c file

我在使用 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 中。它在许多文件中使用,但这些文件中 none 个实际上包含 usbd_conf.c 个,只有 usbd_conf.h 个。问题是,仅包含 header,一个将变量声明为 extern PCD_HandleTypeDef hpcd; 的文件是否可以在不具体包含 .c 文件的情况下使用该变量?
  2. 假设问题 1 的答案是肯定的,为什么函数 OTG_FS_IRQHandler 找不到 hpcd?来自 stm32f4xx_it 的包含链是 main.h -> usbd_core.h -> usbd_conf.h.

我假设问题 1 的答案是肯定的,因为我相信这是我购买时板上 运行 的演示代码。我只能假设问题出在我构建它的方式上。有人愿意帮我解决这个问题吗?如果相关或为了更好地构建这个问题,我很乐意提供更多细节,但我试图避免在我的问题中发布完整的 USB 堆栈。谢谢。

如果您将 extern PCD_HandleTypeDef hpcd; 放在每个相关人员都包含的 header 之一中可能会有所帮助(我认为 main.h 就可以)。

extern 东西如何正常工作的示例:

确实定义了您要在别处使用的变量的文件包含

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

headera_header.h包含

extern some_variable;

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

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

以便链接器确切地知道如何处理它。