我无法使用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
。问题是,只包含标题,声明变量为extern PCD_HandleTypeDef hpcd;
的文件是否可以使用变量而不包含.c
文件?OTG_FS_IRQHandler
没有找到hpcd
?来自stm32f4xx_it
的包含链是main.h -> usbd_core.h -> usbd_conf.h
。我假设问题1的答案是肯定的,因为这是我购买时我认为在电路板上运行的演示代码。我只能假设这个问题与我正在构建它的方式有关。有人愿意帮我解决这个问题吗?我很乐意提供更多相关细节或更好地构建这个问题,但我试图避免在我的问题中发布完整的USB堆栈。谢谢。
答案 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;
这样链接器就会知道如何处理它。