我在使用 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 存储库来跟踪项目。变量 hpcd
在 template/src/usbd_conf.c
中定义。不幸的是,我对 C/C++ 的了解充满了漏洞,所以我希望有人可以帮助我缩小问题范围并提出解决问题的正确方法。
我有两个问题。
hpcd
包含在文件usbd_conf.c
中。它在许多文件中使用,但这些文件实际上都不包含usbd_conf.c
,仅包含usbd_conf.h
。问题是,仅包含 header ,将变量声明为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;
放在每个相关人员都包含的 header 之一中可能会有所帮助(我认为 main.h
可以)。
extern
正常工作的例子:
一个定义了你想在别处使用的变量的文件包含
include "a_header.h";
// ...
int some_variable = 42;
header a_header.h
包含
extern some_variable;
要使用该变量的文件包含
include "a_header.h";
extern some_variable;
//...
foo = some_variable;
some_variable = 47;
这样链接器就知道要用它做什么。
关于c - 我应该如何在c文件中包含用extern定义的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38034121/