升级Espressif Framework 6.0.1后ESP32-CAM编译失败求助
ESP32-CAM + PlatformIO 升级Espressif32至6.0.1后编译失败问题解决
问题背景
- 硬件:ESP32-CAM v2.0
- PlatformIO核心版本:6.1.6
- 初始环境:Espressif32 5.x,程序可正常编译运行,但串口监视器及
ESP_LOGI无输出 - 操作:通过PlatformIO依赖更新功能升级至Espressif32 @6.0.1后,编译出现两类问题:
esp32-camera/conversions/esp_jpeg_decode.c环节出现指针类型不兼容警告- 因找不到
esp32/spiram.h文件导致编译失败
- 已尝试:手动/通过PlatformIO菜单清理
.pio文件夹后重新编译,问题未解决 - 程序功能:每隔1秒拍摄照片+WiFi连接,原5.x环境下拍照功能正常
完整报错信息
Compiling .pio\build\esp32cam\bootloader\soc\esp32\touch_sensor_periph.o Compiling .pio\build\esp32cam\bootloader\soc\esp32\uart_periph.o Generating partitions .pio\build\esp32cam\partitions.bin Compiling .pio\build\esp32cam\lib533\esp32-camera\conversions\esp_jpg_decode.o Compiling .pio\build\esp32cam\lib533\esp32-camera\conversions\jpge.o cc1.exe: warning: command-line option '-fno-rtti' is valid for C++/D/ObjC++ but not for C Archiving .pio\build\esp32cam\bootloader\esp-idf\soc\libsoc.a Compiling .pio\build\esp32cam\lib533\esp32-camera\conversions\to_bmp.o Indexing .pio\build\esp32cam\bootloader\esp-idf\soc\libsoc.a .pio/libdeps/esp32cam/esp32-camera/conversions/esp_jpg_decode.c: In function 'esp_jpg_decode': .pio/libdeps/esp32cam/esp32-camera/conversions/esp_jpg_decode.c:105:41: warning: passing argument 2 of 'jd_prepare' from incompatible pointer type [-Wincompatible-pointer-types] 105 | JRESULT jres = jd_prepare(&decoder, _jpg_read, work, 3100, &jpeg); | ^~~~~~~~~ | | | uint32_t (*)(JDEC *, uint8_t *, uint32_t) {aka long unsigned int (*)(JDEC *, unsigned char *, long unsigned int)} In file included from .pio/libdeps/esp32cam/esp32-camera/conversions/esp_jpg_decode.c:19: C:/Users/Patron/.platformio/packages/framework-espidf/components/esp_rom/include/esp32/rom/tjpgd.h:91:28: note: expected 'UINT (*)(JDEC *, BYTE *, UINT)' {aka 'unsigned int (*)(JDEC *, unsigned char *, unsigned int)'} but argument is of type 'uint32_t (*)(JDEC *, uint8_t *, uint32_t)' {aka 'long unsigned int (*)(JDEC *, unsigned char *, long unsigned int)'} 91 | JRESULT jd_prepare (JDEC*, UINT(*)(JDEC*,BYTE*,UINT), void*, UINT, void*); | ^~~~~~~~~~~~~~~~~~~~~~~~~ .pio/libdeps/esp32cam/esp32-camera/conversions/esp_jpg_decode.c:117:32: warning: passing argument 2 of 'jd_decomp' from incompatible pointer type [-Wincompatible-pointer-types] 117 | jres = jd_decomp(&decoder, _jpg_write, (uint8_t)jpeg.scale); | ^~~~~~~~~~ | | | uint32_t (*)(JDEC *, void *, JRECT *) {aka long unsigned int (*)(JDEC *, void *, JRECT *)} In file included from .pio/libdeps/esp32cam/esp32-camera/conversions/esp_jpg_decode.c:19: C:/Users/Patron/.platformio/packages/framework-espidf/components/esp_rom/include/esp32/rom/tjpgd.h:92:27: note: expected 'UINT (*)(JDEC *, void *, JRECT *)' {aka 'unsigned int (*)(JDEC *, void *, JRECT *)'} but argument is of type 'uint32_t (*)(JDEC *, void *, JRECT *)' {aka 'long unsigned int (*)(JDEC *, void *, JRECT *)'} 92 | JRESULT jd_decomp (JDEC*, UINT(*)(JDEC*,void*,JRECT*), BYTE); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ cc1.exe: warning: command-line option '-fno-rtti' is valid for C++/D/ObjC++ but not for C Compiling .pio\build\esp32cam\lib533\esp32-camera\conversions\to_jpg.o Linking .pio\build\esp32cam\bootloader.elf .pio/libdeps/esp32cam/esp32-camera/conversions/to_bmp.c:26:10: fatal error: esp32/spiram.h: No such file or directory 26 | #include "esp32/spiram.h" | ^~~~~~~~~~~~~~~~ compilation terminated. *** [.pio\build\esp32cam\lib533\esp32-camera\conversions\to_bmp.o] Error 1 .pio/libdeps/esp32cam/esp32-camera/conversions/to_jpg.cpp:27:10: fatal error: esp32/spiram.h: No such file or directory 27 | #include "esp32/spiram.h" | ^~~~~~~~~~~~~~~~ compilation terminated. *** [.pio\build\esp32cam\lib533\esp32-camera\conversions\to_jpg.o] Error 1 ============================================= [FAILED] Took 633.54 seconds =============================================
问题根源
- 类型定义不兼容:Espressif32 6.x版本中,
jd_prepare/jd_decomp函数声明的回调参数类型从UINT变更为uint32_t,但官方esp32-camera库未同步更新代码,导致指针类型不匹配警告 - 头文件路径变更:
esp32/spiram.h在Espressif32 6.x中已移除或路径修改,旧版esp32-camera库仍引用该旧路径,引发致命编译错误
解决办法
回退Espressif32至兼容的5.x版本(如5.3.0),使用以下platformio.ini配置:
[env:esp32cam] ;src_file = main platform = espressif32@5.3.0 ; <-- 指定兼容版本 board = esp32cam framework = espidf ;esp-idf-v4.4.2 monitor_speed = 115200 ;upload_port = COM[4] lib_deps = espressif/esp32-camera@^2.0.0 ;lib_deps = esp32-camera build_flags = -I../lib/esp32-camera ; 设置CPU频率为240MHz board_build.f_cpu = 240000000L
内容的提问来源于stack exchange,提问作者lightshadown
相关产品推荐
相关产品推荐

