4. cubeIDE工程编译报错(xxx.hpp: No such file or directory)----小结

1. cubeIDE打开工程并编译
    1.左键双击打开工程目录下的.project 文件,打开后点 Build 编译工程。
    注意:可能出现以下错误:
       问题a. 缺少头文件编译出错
            TouchGFX V1.18.0 有个已知Bug:生成代码时只会在 CubeMX 中当前选中的 Toolchain / IDE 生成完整的工程文件,
例如,如果 CubeMX 的 Project Manager 中选择的是 STM32CubeIDE,但后来为了某些原因(比如想把工程也生成一份 MDK 的)切换过配置,
可能会导致 IDE 工程文件夹里的文件不完整或互相干扰,从而出现头文件路径丢失的报错。
        (解决方案:把 STM32CubeIDE 文件夹整体删除,重新用 MX 生成。)

       问题b. Videos.s文件报错:TouchGFX 生成的代码中可能包含一个名为 Videos.s 的汇编文件(用于视频解码或播放相关功能),
但 IDE 默认没有自动包含这个文件所在的目录。当编译器试图链接这个文件时,就会因为找不到它而报错。解决方案如下:
        1.打 开 工 程 Properties , C/C++ General->Paths and Symbols->Source Location->/XXX/TouchGFX,
        2.打 开 Filter , 点 Add... , 加入../TouchGFX/generated/videos/src/keil/Videos.s 文件,应用退出再编译。
        (或者Video.s文件不再上述目录中,找到这个文件按照上面的方法指定就可以了)

       问题c. Memset 报错(未定义引用):代码中使用了 memset() 这个标准库函数,但包含它的头文件 <string.h> 没有被引入。
        (解决方案:在相应的源文件中加入#include <string.h>)
 
       问题d. 多余的文件(有时CubeMX 或 TouchGFX Designer生成代码时,会留下一些旧版或不再需要的文件,这些残留文件可能与新生成的代码冲突,导致一些奇怪的编译错误。)
        (解决方案:删除相应的目录,依次用 STM32CubeMX 打开 XXX.ioc 和 TouchGFX Designer 打开 XXX.touchgfx 文件重新生成工程)

2. 步上面说的四种报错都没遇到,反而遇到了“D:/develop/stm32H7/stm32H743_v0.1/TouchGFX/target/generated/OSWrappers.cpp:19:10: fatal error: touchgfx/hal/HAL.hpp: No such file or directory    19 | #include <touchgfx/hal/HAL.hpp>”
    问题分析:这是因为项目配置中缺少了指向 touchgfx 目录的搜索路径,编译器无法定位到这个文件.
    解决方案:1.定位文件"HAL.hpp"的位置,它在工程目录Middleware/ST/touchgfx/framework/include目录下,添加此include目录路径
        2.在 Project Explorer 中,右键点击项目,选择底部的 Properties,依次展开 C/C++ General -> Paths and Symbols
        3.Languages选择GNU C,点击Add,然后指定目录"..\Middlewares\ST\touchgfx\framework\include"(注意:
这里当前寻找目录路径是IDE所在的目录,而Middlewares文件在IDE目录的上个文件夹中,用的是相对路径)。
        4.勾选1."Add to all configurations" 2."Add to all languages",点击OK,最后点击"Apply and close"(Add to all languages的作用是把该路径也加到GNU C++中
        4.右击“Properties”,点击"refresh",再次编译即可成功。

2.1 按上面步骤2说的添加头文件路径之后,如果又遇到新的报错如下:
HAL.hpp:110:(.text._ZN8touchgfx3HALD2Ev[_ZN8touchgfx3HALD5Ev]+0x1c): undefined reference to `vtable for touchgfx::HAL'
D:/soft/stm32cubeIDE/install/STM32CubeIDE_2.1.1/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.14.3.rel1.win32_1.0.100.202602081740/tools/bin/../lib/gcc/arm-none-eabi/14.3.1/../../../../arm-none-eabi/bin/ld.exe: ./Application/User/TouchGFX/target/TouchGFXHAL.o: in function `touchgfx::HAL::setFrameBufferSize(unsigned short, unsigned short)':
问题分析:这是因为TouchGFX 库文件缺失或未正确链接 !!!解决方案:删除IDE工程,然后重新用CubeMX生成IDE工程,再去TouchGFXDesigner生成代码(Generator Code),然后再用CubeMX生成一遍代码,再去CubeIDE编译程序,应该就成功了。
(注意:其实这里可能是没有用TouchGFXDesigner生成代码(Generator Code),可以先试试此方法,如果不行再删除IDE工程并重新生成,而且不用删除整个IDE工程,只需要删除IDE工程下的 .project 和 .cproject 和 .setting文件,然后再重新用cubeMX生成代码,然后再用TouchGFXDesigner生成代码(Generator Code),这时候先编译,如果不行最后在"Paths and Symbols"添加路径就可以了)


3. C/C++ General -> Paths and Symbols路径下完整的路径目录应该是下面这样的:
    3.1 如果和图中一致,编译应该没有问题的
        image
       

            按照如上方法添加路径后,可以在C/C++ Build---->Setting中查看配置,如下图
            image
            注意:这里是相对路径,相对路径的好处是移植工程的时候可以直接编译,所以要求工程路径一致用相对路径。
            可以看到这里路径变成了 "../../TouchGFX/App",相对路径是从  .project  文件所在位置开始计算的,所以按道理来说这里路径应该  上翻1次,也就是只有一个 .. 但是不知道为什么虽然在“Path and Symbols”添加“..”后,到这里就变成了"../..",这里编译可以正常通过,所以先不纠结这个问题

4. 注意:如果想添加自己的驱动代码,创建的BSP文件夹里面存放驱动代码,其文件夹存放位置应该在  与cubeIDE同级目录的Drivers目录下,
然后再Path and Symbol添加其路径如下:
image
最后两个"../Drivers/BSP"和"../Drivers/SYSTEM"就是BSP文件夹下的两个文件夹。
然后在工程中将加入的两个文件夹Link进来
image
这样在头文件引用的时候,需要再SYSTEM为当前目录去引用头文件,如下
image
其中提示找不到usart.h文件,这是因为头文件链接后的结果为“../Drivers/SYSTEM/./SYSTEM/usart/usart.h”,这显然是不对的,
应该直接在SYSTEM目录下寻找usart.h文件,也就是 #include "usart/usart.h",这样链接后就是“../Drivers/SYSTEM/usart/usart.h”,这样就可以找到头文件了。


posted @ 2026-07-14 20:36  Vak  阅读(7)  评论(0)    收藏  举报
zhanghz production