我在使用arm-none-eabi
工具链编译STM32F4-局的演示代码时遇到了困难。链接中发生了错误,这是我收到的[第一个]错误。
template/obj/stm32f4xx_it.o: In function `OTG_FS_IRQHandler':
template/src/stm32f4xx_it.c:192: undefined reference to `hpcd'
我一直在尝试将其弄清楚几个月,因此我创建了这个GitHub存储库来跟踪该项目。变量hpcd
在template/src/usbd_conf.c
中定义。不幸的是,我对C/C 的了解充满了漏洞,因此我希望有人可以帮助我缩小问题,并提出适当的解决方法。
我有两个问题。
-
hpcd
包含在文件usbd_conf.c
中。它用于许多文件中,但是这些文件实际上都不包括usbd_conf.c
,仅包括usbd_conf.h
。问题是,仅包括标头,可以将变量声明为extern PCD_HandleTypeDef hpcd;
的文件使用该变量而不具体包含.c
文件? - 假设问题1的答案是肯定的,为什么它函数
OTG_FS_IRQHandler
找不到hpcd
?包括stm32f4xx_it
的链条是main.h -> usbd_core.h -> usbd_conf.h
。
我假设问题1的答案是肯定的,因为这是我认为当我购买时在板上运行的演示代码。我只能假设我的构建方式。有人愿意帮助我解决这个问题吗?如果相关或更好地构建此问题,我很乐意提供更多细节,但是我试图避免在我的问题中发布完整的USB堆栈。谢谢。
如果您将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;
使得链接器毫无疑问地知道该怎么做。