Closed Jiu-xiao closed 1 year ago
Hi @Jiu-xiao.
Could you explain in English how to reproduce the problem? What application do you build?
What does you script ./build-esp32c3.sh
actually do?
Could you also share code of your /home/xiao/code/idf_as_lib/main.cpp
?
main.cpp
/*
* SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: CC0-1.0
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_system.h"
#include "esp_flash.h"
extern "C" void app_main(void)
{
printf("Hello world!\n");
/* Print chip information */
esp_chip_info_t chip_info;
uint32_t flash_size;
esp_chip_info(&chip_info);
printf("This is ESP32 chip with %d CPU cores, WiFi%s%s, ",
chip_info.cores,
(chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
(chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");
printf("silicon revision %d, ", chip_info.revision);
if(esp_flash_get_size(NULL, &flash_size) != ESP_OK) {
printf("Get flash size failed");
return;
}
printf("%dMB %s flash\n", flash_size / (1024 * 1024),
(chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");
for (int i = 10; i >= 0; i--) {
printf("Restarting in %d seconds...\n", i);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
printf("Restarting now.\n");
fflush(stdout);
esp_restart();
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(idf_as_lib LANGUAGES C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(targets "esp32" "esp32s2" "esp32s3" "esp32c3" "esp32h2" "esp32c2")
add_compile_options(--target=riscv32-esp-elf -march=rv32imc -mabi=ilp32 -gdwarf-4)
if("${TARGET}" IN_LIST targets)
# Include for ESP-IDF build system functions
include($ENV{IDF_PATH}/tools/cmake/idf.cmake)
# Create idf::{target} and idf::freertos static libraries
idf_build_process("${TARGET}"
# try and trim the build; additional components
# will be included as needed based on dependency tree
#
# although esptool_py does not generate static library,
# processing the component is needed for flashing related
# targets and file generation
COMPONENTS freertos esptool_py
SDKCONFIG ${CMAKE_CURRENT_LIST_DIR}/sdkconfig
BUILD_DIR ${CMAKE_BINARY_DIR})
else()
message(WARNING "Unknown target ${TARGET}, creating stubs for esp32 instead")
# Create stubs for esp32 and freertos, stub::esp32 and stub::freertos
add_subdirectory(stubs/esp32)
add_subdirectory(stubs/freertos)
add_subdirectory(stubs/spi_flash)
endif()
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(elf_file ${CMAKE_PROJECT_NAME}.elf)
add_executable(${elf_file} main.cpp)
# Link the static libraries to the executable
if("${TARGET}" IN_LIST targets)
target_link_libraries(${elf_file} idf::freertos idf::spi_flash)
# Attach additional targets to the executable file for flashing,
# linker script generation, partition_table generation, etc.
idf_build_executable(${elf_file})
else()
target_link_libraries(${elf_file} stub::esp32 stub::freertos stub::spi_flash)
endif()
Hi @Jiu-xiao.
Could you explain in English how to reproduce the problem? What application do you build? What does you script
./build-esp32c3.sh
actually do?
If I add add_compile_options(-g)
in CMakeLists.txt, an error will be reported when I use clang to compile.
Looks like you build hello_world
example using your custom build script.
I recommend you to use idf.py
for building your app.
IDF_TOOLCHAIN=clang idf.py set-target esp32c3
IDF_TOOLCHAIN=clang idf.py build
The commands above pick up compiler settings from https://github.com/espressif/esp-idf/blob/master/tools/cmake/toolchain-clang-esp32c3.cmake
I checked it. It has no problems with your main.cpp
If I add add_compile_options(-g) in CMakeLists.txt, an error will be reported when I use clang to compile.
Unfortunately I can not build app with your CMakefile.txt
. Looks like it does not work well with idf.py build
. But when I use the commands above with -gdwarf-4
added to CMAKE_C_FLAGS, CMAKE_CXX_FLAGS and CMAKE_ASM_FLAGS it works well. Adding -g
alone does not work because Clang 15 uses DWARF5 by default. GNU as
has problem with it. Our current Clang toolchain uses riscv32-esp-elf-as
as assembler, because integrated one is not well tested yet with IDF code.
Fixed
Answers checklist.
IDF version.
v5.1-dev-2926-g3df87a91a3
Operating System used.
Linux
How did you build your project?
Command line with CMake
If you are using Windows, please specify command line type.
None
What is the expected behavior?
我使用idf-as-lib的例程,但是将main.c更改为main.cpp。然后使用./build-esp32c3.sh编译,并且将脚本中的
PARAM="-DCMAKE_TOOLCHAIN_FILE=$IDF_PATH/tools/cmake/toolchain-${TARGET}.cmake -DTARGET=${TARGET} -GNinja"
更改为PARAM="-DCMAKE_TOOLCHAIN_FILE=$IDF_PATH/tools/cmake/toolchain-clang-${TARGET}.cmake -DTARGET=${TARGET} -GNinja"
,编译成功,并没有出现问题。What is the actual behavior?
但是我在我的CMakeLists.txt中加入
add_compile_options(-g)
之后,编译出现错误。我对比了两次编译生成的compile_commands.json文件,只有-g这一个参数有区别Steps to reproduce.
复制官方的idf-as-lib工程,将main.c重命名为main.cpp。为app_main函数添加extern “C”修饰,然后将build.sh中的
toolchain-${TARGET}.cmake
更改为toolchain-clang-${TARGET}.cmake
。运行./build-esp32c3.sh进行编译Build or installation Logs.
More Information.
No response