无法编译 ESP-IDF 示例工程

Unable to compile ESP-IDF example project

我正在尝试编译我的第一个 ESP32 示例项目。 我使用所有最新工具设置 Visual Studio 代码。 (Python、工具链等)。 我不确定我到底需要什么,因为我是这个环境的新手,所以也许我错过了一些东西。

我遵循了关于如何创建和编译第一个项目的用户指南,我使用了示例文件夹中的 Blink 项目。

这是我得到的。

> Executing task: cmake -G Ninja .. <

-- Project is not inside a git repository, or git repository has no commits; will not use 'git describe' to determine PROJECT_VER.
-- Building ESP-IDF components for target esp32s2
-- Checking Python dependencies...
Python requirements from C:\Users\dmitryke\esp\esp-idf\requirements.txt are satisfied.
-- Project sdkconfig file C:/ESP32_projects/blink/sdkconfig
Loading defaults file C:/ESP32_projects/blink/sdkconfig.defaults...
-- Components:
-- Component paths:
-- Configuring done
-- Generating done
-- Build files have been written to C:/ESP32_projects/blink/build

The terminal will be reused by tasks, press any key to close it.

> Executing task: cmake --build . <

[1/1] Linking C executable blink.elf
FAILED: blink.elf 
cmd.exe /C "cd . && C:\Users\dmitryke\.espressif\tools\xtensa-esp32s2-elf\esp-2020r3-8.4.0\xtensa-esp32s2-elf\bin\xtensa-esp32s2-elf-gcc.exe -mlongcalls   CMakeFiles/blink.elf.dir/project_elf_src.c.obj  -o blink.elf  -Wl,--cref -Wl,--Map=C:/ESP32_projects/blink/build/blink.map  -fno-rtti  -fno-lto && cd ."
c:/users/dmitryke/.espressif/tools/xtensa-esp32s2-elf/esp-2020r3-8.4.0/xtensa-esp32s2-elf/bin/../lib/gcc/xtensa-esp32s2-elf/8.4.0/../../../../xtensa-esp32s2-elf/bin/ld.exe: c:/users/dmitryke/.espressif/tools/xtensa-esp32s2-elf/esp-2020r3-8.4.0/xtensa-esp32s2-elf/bin/../lib/gcc/xtensa-esp32s2-elf/8.4.0/../../../../xtensa-esp32s2-elf/lib/no-rtti/crt0.o:(.literal+0x0): undefined reference to `main'
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
The terminal process "C:\windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command cmake --build ." terminated with exit code: 1.

Terminal will be reused by tasks, press any key to close it.

我删除了 blink.c 中的所有内容以避免代码错误。

blink.c

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"

/* Can use project configuration menu (idf.py menuconfig) to choose the GPIO to blink,
   or you can edit the following line and set a number here.
*/
#define BLINK_GPIO 0x01

void app_main(void)
{
    while(1) {    }
}

另外一个问题,有个选项是运行 idf.py menuconfig。 有时它有效,有时它说:

C:\ESP32_projects\blink>idf.py menuconfig
'idf.py' is not recognized as an internal or external command,
operable program or batch file.

任何帮助将不胜感激!

所有 ESP IDF 任务(cmake、idf.py 等)必须 运行 在准备好的环境中。我将从失去 VSC(因为它只是另一个潜在的故障点)并使用基本的 ESP IDF command prompt 开始。尝试 运行ning idf.py menuconfigidf.py buildidf.py -p COMx flash 来配置、构建和刷新您的测试项目。

验证 ESP IDF 环境和项目正常运行后,返回 VSC 并查看那里有什么问题。

作为一个工作示例,这就是我在我的机器上(Linux、ESP IDF v4.2.1)从头开始编译同一个示例项目的方式:

$ cp -r ~/esp-idf/examples/get-started/blink/ .
$ cd blink
$ idf.py build
Running cmake in directory /home/tarmo/tmp/espidftest/blink/build                                                                                                                                                  
Executing "cmake -G Ninja -DPYTHON_DEPS_CHECKED=1 -DESP_PLATFORM=1 -DCCACHE_ENABLE=0 /home/tarmo/tmp/espidftest/blink"... 
-- Found Git: /usr/bin/git (found version "2.30.2")                                                                                                                                                                
-- IDF_TARGET not set, using default target: esp32                                                                                                                                                                 
-- The C compiler identification is GNU 8.4.0                                                                                                                                                                      
-- The CXX compiler identification is GNU 8.4.0   

[SNIP]

esptool.py v3.0                                                                                                                                                                                                    
Generated /home/tarmo/tmp/espidftest/blink/build/bootloader/bootloader.bin                                                                                                                                         
[934/934] Generating binary image from built executable                                                                                                                                                            
esptool.py v3.0                                                                                                                                                                                                    
Generated /home/tarmo/tmp/espidftest/blink/build/blink.bin                                                                                                                                                         
                                                                                                                                                                                                                   
Project build complete. To flash, run this command:                                                                                                                                                                
/home/tarmo/espressif/python_env/idf4.2_py3.9_env/bin/python ../esp-idf/components/esptool_py/esptool/esptool.py -p (PORT) -b 921600 --before default_reset
 --after hard_reset --chip esp32  write_flash --flash_mode dio --flash_size detect --flash_freq 40m 0x1000 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin 0x10000 build/blink.bin
or run 'idf.py -p (PORT) flash'
$ ls -lha
drwxr-xr-x 8 tarmo tarmo 4,0K juuni  4 12:26 build
-rw-r--r-- 1 tarmo tarmo  234 juuni  4 12:25 CMakeLists.txt
-rw-r--r-- 1 tarmo tarmo 1,5K juuni  4 12:25 example_test.py
drwxr-xr-x 3 tarmo tarmo 4,0K juuni  4 12:26 main
-rw-r--r-- 1 tarmo tarmo  177 juuni  4 12:25 Makefile
-rw-r--r-- 1 tarmo tarmo  157 juuni  4 12:25 README.md
-rw-r--r-- 1 tarmo tarmo  33K juuni  4 12:25 sdkconfig
-rw-r--r-- 1 tarmo tarmo    3 juuni  4 12:25 sdkconfig.defaults

命令 window 不太重要,我让它工作了。 我的主要问题是 main 没有链接。

我在 VS Code 中构建 ESP 项目时遇到了同样的问题,但找到了解决方案:项目需要在与示例名称不同的文件夹中创建。

我尝试了 blink 项目,在 c:\esp-idf\ 而不是在 c:\esp-idf\blink 中创建它时它可以工作。后者将在 blink 文件夹中创建一个名为 blink 的文件夹。

您可以将这段代码添加到您的 main() 中,首先检查您的 esp-idf 环境:

    gpio_reset_pin(BLINK_GPIO);
    gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
    while(1) {
        printf("Turning off the LED\n");
        gpio_set_level(BLINK_GPIO, 0);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
        printf("Turning on the LED\n");
        gpio_set_level(BLINK_GPIO, 1);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }

别忘了关闭之前的终端再打开。