当前位置: 首页 > article >正文

关于ESP-IDF 5.4 中添加第三方组件esp32-camera找不到文件,编译错误解决办法(花了一天时间解决)

最近需要使用ESP32-S3-CAM 的OV2640摄像头采集图像,为了加速开发进度,于是选择了esp32-camera组件,该组件不是官方组件,需要自己git clone。但在为项目添加esp32-camera组件时,一直编译错误,找不到头文件,即使把所有头文件都告诉编译器,最后也找不到头文件里的函数实现。花了一天时间,最后偶然解决。

开发环境:VsCode+ESP-IDF5.4 WINDOWS 10
尝试但失败的方法:

  1. 在自己的项目根目录下添加 components文件夹,直接拉取网友提供的镜像
git clone https://gitee.com/billyzh/esp32-camera.git

然后配置根目录下的cmakelist文件,比如添加以下一条,都没卵用

set(EXTRA_COMPONENT_DIRS components)
set(EXTRA_COMPONENT_DIRS components/esp32-camera)
  1. ctrl+shift+P 调出命令框,搜索ESP-IDF:create… 命令,创建新的test组件。创建后我把esp32-camera里的全部内容移动到test下,依然没有任何卵用。

  2. 直接在c_cpp_properties.json中,使用绝对路径把esp32-camera里的头文件全部引用,但是使用时没有连接到实现的函数

  3. 其他,乱七八糟的修改参数,问deepseek,豆包,kimi都没卵用,人工智障的方案太老,没有任何作用,还引入了新的问题

最终解决方案:
我突发奇想,既然ESP-IDF安装路径下components文件夹,那么我直接把esp32-camera放到里面应该没问题,可惜,能用,但找不到函数实现方法,也就是找到.h了,但找不到.c。

最后我直接在 D:\Espressif\frameworks\esp-idf-v5.4\ 文件夹下,创建自定义文件夹user_components,然后把esp32-camera放到里面。然后在项目根目录的cmaklist.txt添加了一行:set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/user_components)

然后在main文件夹下的cmakelist.txt添加

idf_component_register(SRCS "main.cpp" 
                            "./src/LCD/ST7735S.cpp" 
                            "./src/CAMERA/CAMERA.cpp" 
         
                       INCLUDE_DIRS "./src/LCD" 
                                    "./src/WIFI"
                                    "./src/CAMERA"
                                    "${IDF_PATH}/components/esp_driver_spi/include" 
                                    "${IDF_PATH}/components/esp_driver_gpio/include" 
                                    "${IDF_PATH}/components/esp_timer/include" 
                                    "${IDF_PATH}/components/log/include"
                                    "${IDF_PATH}/components/esp_driver_ledc/include" 
                                    "${IDF_PATH}/user_components/esp32-camera/driver/include"  # 添加慈行

                         PRIV_REQUIRES nvs_flash esp_psram)



神奇的是,我的测试示例居然编译成功了,烧录后成功运行。
在这里插入图片描述
在这里插入图片描述

但VsCode里头文件报错找不到,也就是能编译,但编辑器又找不到文件,无法跳转查看
于是又区修改c_cpp_properties.json,最后完美解决

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "${config:idf.espIdfPath}/components/**",
                "${config:idf.espIdfPathWin}/components/**",
                "${config:idf.espIdfPathWin}/user_components/**"  // 添加这行
            ],
            "browse": {
                "path": [
                    "${config:idf.espIdfPath}/components",
                    "${config:idf.espIdfPathWin}/components",
                    "${config:idf.espIdfPathWin}/user_components/**", // 添加这行
                    "${workspaceFolder}"
                ],
                "limitSymbolsToIncludedHeaders": false
            },
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "${config:idf.toolsPathWin}\\tools\\xtensa-esp-elf\\esp-14.2.0_20241119\\xtensa-esp-elf\\bin\\xtensa-esp32s3-elf-gcc.exe"
        }
    ],
    "version": 4
}
#include "CAMERA.h"

esp_err_t camera_init(void)
{
    camera_config_t config;
    config.ledc_channel = LEDC_CHANNEL_0;
    config.ledc_timer = LEDC_TIMER_0;
    config.pin_d0 = Y2_GPIO_NUM;
    config.pin_d1 = Y3_GPIO_NUM;
    config.pin_d2 = Y4_GPIO_NUM;
    config.pin_d3 = Y5_GPIO_NUM;
    config.pin_d4 = Y6_GPIO_NUM;
    config.pin_d5 = Y7_GPIO_NUM;
    config.pin_d6 = Y8_GPIO_NUM;
    config.pin_d7 = Y9_GPIO_NUM;
    config.pin_xclk = XCLK_GPIO_NUM;
    config.pin_pclk = PCLK_GPIO_NUM;
    config.pin_vsync = VSYNC_GPIO_NUM;
    config.pin_href = HREF_GPIO_NUM;
    config.pin_sccb_sda = SIOD_GPIO_NUM;
    config.pin_sccb_scl = SIOC_GPIO_NUM;
    config.pin_pwdn = PWDN_GPIO_NUM;
    config.pin_reset = RESET_GPIO_NUM;
    config.xclk_freq_hz = 20000000;
    config.pixel_format = PIXFORMAT_JPEG;

    config.frame_size = FRAMESIZE_UXGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;

    // Camera init
    esp_err_t err = esp_camera_init(&config);
    if (err != ESP_OK)
    {
        ESP_LOGE("CAMERA", "Camera init failed with error 0x%x", err);
        return err;
    }

    return ESP_OK;
}
#ifndef _CAMERA_H_
#define _CAMERA_H_

#include "esp_camera.h"
#include "driver/gpio.h"
#include "esp_log.h"



#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 15
#define SIOD_GPIO_NUM 4
#define SIOC_GPIO_NUM 5

#define Y2_GPIO_NUM 11
#define Y3_GPIO_NUM 9
#define Y4_GPIO_NUM 8
#define Y5_GPIO_NUM 10
#define Y6_GPIO_NUM 12
#define Y7_GPIO_NUM 18
#define Y8_GPIO_NUM 17
#define Y9_GPIO_NUM 16

#define VSYNC_GPIO_NUM 6
#define HREF_GPIO_NUM 7
#define PCLK_GPIO_NUM 13

// 初始化摄像头的函数声明
esp_err_t camera_init(void);
#endif
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "CAMERA.h"
static const char *TAG = "MAIN_TEST";

// 任务句柄
TaskHandle_t task1_handle = NULL;
TaskHandle_t task2_handle = NULL;

// 函数声明
void task_1(void *pvParameters);
void task_2(void *pvParameters);

// 入口函数导出
extern "C" void app_main()
{

    // 创建 task_1 任务,指定运行在核心 0
    BaseType_t result1 = xTaskCreatePinnedToCore(task_1, "task_1", 1024 * 10, NULL, 1, &task1_handle, 0);

    // 创建 task_2 任务,指定运行在核心 0
    BaseType_t result2 = xTaskCreatePinnedToCore(task_2, "task_2", 1024 * 10, NULL, 1, &task2_handle, 0);
}

// task_1 任务函数
void task_1(void *pvParameters)
{

    while (1)
    {
        vTaskDelay(pdMS_TO_TICKS(1000)); // 延迟 1 秒
        ESP_LOGI(TAG, "这是 task_1 在运行");
    }
}

// task_2 任务函数
void task_2(void *pvParameters)
{
    camera_init();
    vTaskDelay(pdMS_TO_TICKS(500));
    while (1)
    {
        ESP_LOGI(TAG, "这是 task_2 在运行");
        vTaskDelay(pdMS_TO_TICKS(100));
      
    }
}


http://www.kler.cn/a/537350.html

相关文章:

  • C++单例模式
  • 用AVFrame + AVPacket 完成accede编码和直接用ffmpeg命令行实现acc编码的对比
  • DeepSeek和ChatGPT的对比
  • 完美解决phpstudy安装后mysql无法启动
  • BUU22 [护网杯 2018]easy_tornado 1
  • intra-mart实现简易登录页面笔记
  • zzcms index.php存在SQL注入漏洞
  • 华为支付-免密支付接入签约代扣场景开发步骤
  • 【Flink快速入门-1.Flink 简介与环境配置】
  • 深入学习索引
  • Python爬虫--requests库
  • Docker 和 Docker Compose
  • 青龙面板部署定时脚本自动化运行
  • STM32 I2C外设
  • 自定义v-model修饰符
  • 【理论知识】 2D 卷积、3D 卷积与 3D 池化
  • matlab simulink 四分之一模型车+人体和座椅
  • 消息队列高手课总结笔记——基础篇速通
  • 初始JavaEE篇 —— Spring Web MVC入门(下)
  • 详解SQLAlchemy的函数relationship
  • .net的一些知识点6
  • 【ESP32cam人脸识别开门及服务器端实战源码】
  • 回退 android studio emulator 的版本
  • 51单片机之使用Keil uVision5创建工程以及使用stc-isp进行程序烧录步骤
  • 【测试开发】Python+Django实现接口测试工具
  • docker 网络详解