stm32 - STM32 上 FreeRTOS 编译的 Truestudio 编译错误
问题描述
我在使用 Truestudio 在 STM32 上编译 FreeRTOS 时遇到编译错误。
/home/dd/Atollic/TrueSTUDIO/STM32_workspace_9.0/STM32L071KZ_RTOS/Debug/../Src/main.c:236: undefined reference to `HAL_SYSTICK_Config'
/home/dd/Atollic/TrueSTUDIO/STM32_workspace_9.0/STM32L071KZ_RTOS/Debug/../Src/main.c:240: undefined reference to `HAL_SYSTICK_CLKSourceConfig'
/home/dd/Atollic/TrueSTUDIO/STM32_workspace_9.0/STM32L071KZ_RTOS/Debug/../Src/main.c:243: undefined reference to `HAL_NVIC_SetPriority'
Src/main.o: In function `main':
/home/dd/Atollic/TrueSTUDIO/STM32_workspace_9.0/STM32L071KZ_RTOS/Debug/../Src/main.c:107: undefined reference to `HAL_Init'
Src/main.o: In function `MX_GPIO_Init':
Src/main.o: In function `main':
/home/dd/Atollic/TrueSTUDIO/STM32_workspace_9.0/STM32L071KZ_RTOS/Debug/../Src/main.c:147: undefined reference to `osThreadCreate'
/home/dd/Atollic/TrueSTUDIO/STM32_workspace_9.0/STM32L071KZ_RTOS/Debug/../Src/main.c:151: undefined reference to `osThreadCreate'
/home/dd/Atollic/TrueSTUDIO/STM32_workspace_9.0/STM32L071KZ_RTOS/Debug/../Src/main.c:155: undefined reference to `osThreadCreate'
/home/dd/Atollic/TrueSTUDIO/STM32_workspace_9.0/STM32L071KZ_RTOS/Debug/../Src/main.c:167: undefined reference to `osKernelStart'
关于如何解决这个问题的任何想法?
解决方案
“未定义的引用”是一个链接器错误,在您的情况下,这可能意味着您没有编译所有必要的文件或所需的函数被预处理器指令“禁用”。但是,查看您的链接器如何抱怨HAL_Init
丢失 - 没有被任何 或类似内容包围#if
-#ifdef
意味着您的问题可能是由于源文件根本没有被编译。这也不是缺少静态库的问题,因为 HAL 是以源代码的形式交付的。
要解决您的问题,请执行以下操作:
确保相应的源文件(不是头文件)包含在您的项目中。比如
HAL_Init
位于stm32f7xx_hal.c
(对于STM32F7、F4等都有类似的文件,看你用什么)。在 Eclipse / Truestudio 中,最简单的方法是通过Top menu -> Navigate -> Open Resource... (CTRL+Shift+R)
并输入文件名。如果它不存在 - 该文件未添加到您的项目中,此时您应该添加它。如果您确实打开了文件,这并不一定意味着它正在构建,因为它可能被排除在外。根据您添加目录的方式,Eclipse 有时可能会决定默认将其作为一个整体禁用。转到项目资源管理器中的文件(如果您在上一步的编辑器中仍然打开文件,您可以单击两个箭头图标导航到文件:)。该文件 - 可能还有它所在的整个目录 - 不应该是灰色的/删除线。右键单击该文件并选择
Resource Configurations -> Exclude from Build...
. 确保未检查您要构建的项目配置。
为了进一步确保您已正确完成所有操作并且确实编译了所需的文件,请右键单击它(例如stm32f7xx_hal.c
)并选择Build Selected File(s)
. 您应该看到的是编译器命令行及其输出,例如arm-none-eabi-...
. 如果该文件从构建中排除,您只会看到Info: Internal Builder is used for build
后面hh:mm:ss Build Finished (took Xs.YYYms)
有编译器的命令行参数,但没有行。尝试在您的项目中已知可编译的文件上执行此操作(main.c
根据您发布的内容进行编译)并比较结果。
推荐阅读
- api - 我们可以使用 API 密钥从 Dialogflow 代理访问数据吗?
- php - 递归对象实例化(在 PHP 中)?
- cookies - Nextjs - 在 _app init 上获取 cookie 值
- facebook - 获取 Facebook 用户的个人资料 ID?
- git - 如何在本地机器上将 Postman 与 Git 集成
- pytorch - JIT Pytorch 中的整理功能
- javascript - 我需要使用 pop 和 shift 方法在控制台上显示两个数组的结果
- imagemagick - 有哪些 imagemagick 命令的示例,其中可以在 magick 和输入文件名之间提供选项
- algorithm - 如何测试一个条件是否与其他条件不矛盾
- excel - 如何防止 Excel VBA 更改我的字符串变量