首页 > 解决方案 > 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'

关于如何解决这个问题的任何想法?

标签: stm32freertostruestudio

解决方案


“未定义的引用”是一个链接器错误,在您的情况下,这可能意味着您没有编译所有必要的文件或所需的函数被预处理器指令“禁用”。但是,查看您的链接器如何抱怨HAL_Init丢失 - 没有被任何 或类似内容包围#if-#ifdef意味着您的问题可能是由于源文件根本没有被编译。这也不是缺少静态库的问题,因为 HAL 是以源代码的形式交付的。

要解决您的问题,请执行以下操作:

  • 确保相应的文件(不是头文件)包含在您的项目中。比如HAL_Init位于stm32f7xx_hal.c(对于STM32F7、F4等都有类似的文件,看你用什么)。在 Eclipse / Truestudio 中,最简单的方法是通过Top menu -> Navigate -> Open Resource... (CTRL+Shift+R)并输入文件名。如果它不存在 - 该文件未添加到您的项目中,此时您应该添加它。

  • 如果您确实打开了文件,这并不一定意味着它正在构建,因为它可能被排除在外。根据您添加目录的方式,Eclipse 有时可能会决定默认将其作为一个整体禁用。转到项目资源管理器中的文件(如果您在上一步的编辑器中仍然打开文件,您可以单击两个箭头图标导航到文件:)https://i.imgur.com/mGf0lHf.png。该文件 - 可能还有它所在的整个目录 - 不应该是灰色的/删除线。右键单击该文件并选择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根据您发布的内容进行编译)并比较结果。


推荐阅读