Я пытаюсь добавить эту библиотеку в свое приложение ESP-IDF в коде Visual Studio (не используя PlatformIO).
Вот шаг, который я сделал:
components/components/
в корне моего проектаmain.cpp
:#define EVE_CS GPIO_NUM_47
#define EVE_PDN GPIO_NUM_11
#define EVE_SCK GPIO_NUM_19
#define EVE_MISO GPIO_NUM_20
#define EVE_MOSI GPIO_NUM_21
#define EVE_NHD_50
#include <stdio.h>
#include "../components/components/FT800-FT813-5.x/src/EVE.h"
void app_main(void)
{
EVE_init_spi();
}
Теперь компоновщик терпит неудачу:
/home/mark/myproject/main/main.c:14:(.text.app_main+0x3): неопределенная ссылка на `EVE_init_spi'
README библиотеки гласит:
Платформа, для которой компилируется код, автоматически определяется по флагам компилятора в EVE_target.h.
Действительно, внутри EVE_target.h
я вижу:
#if defined (ESP_PLATFORM)
#include "EVE_target/EVE_target_ESP32.h"
#endif /* ESP_PLATFORM */
и ESP_PLAFTORM
имеет значение 1 (я вижу, что он наведен на курсор мыши, и появляется всплывающая подсказка). Потом я подписался на EVE_target_ESP32.h
и там тоже платформа определена. Но реализация void EVE_init_spi(void);
находится внутри EVE_target.c
и внутри этого файла ESP_PLAFORM
не определена.
Следовательно, весь код, относящийся к ESP32 (и даже к другим платформам), не включен, и я думаю, что это причина ошибки компоновщика.
Поскольку я поместил папку библиотеки в каталог components
, я ожидал, что она уже обрабатывается CMake. Кстати, это файлы CMakeLists.txt верхнего уровня и уровня кода:
cmake_minimum_required(VERSION 3.16)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(myproject)
и
idf_component_register(SRCS "main.c"
INCLUDE_DIRS ".")
Я обнаружил, что ESP_PLATFORM
определяется скриптом Ninja при вызове компилятора:
DEFINES = -DESP_PLATFORM
Что еще мне нужно установить, чтобы сделать ESP_PLATFORM
доступным и для EVE_target.c
?
@Tsyvarev, возможно, это мое недоразумение: должен ли я вручную добавлять каждый файл .c, который у меня может быть в папке библиотеки, для idf_component_register()
вызова?
@Mark Да, но в отдельном файле компонента CMakeLists.txt см. мой ответ для получения дополнительной информации. Если есть файлы .c, которые не нужны для вашего случая использования (например, если они предназначены для других чипов, кроме ESP32-S3), вы, конечно, можете их пропустить.
В компоненте отсутствует файл CMakeLists.txt
для взаимодействия с системой сборки ESP-IDF.
Добавьте файл CMakeLists.txt в свой каталог FT800-FT813-5.x
в соответствии с документацией по компонентам системы сборки ESP-IDF. Он содержит вызов idf_component_register()
и, среди прочего, гарантирует, что исходные файлы созданы и пути включения установлены правильно.
После этого вам нужно изменить вызов в файле main
компонента CMakeLists.txt
на:
idf_component_register(SRCS "main.c"
INCLUDE_DIRS "."
PRIV_REQUIRES "FT800-FT813-5.x")
Я бы также предложил удалить двойной каталог components
, я не уверен, что система сборки все еще распознает компонент в текущей структуре.
«... находится внутри
EVE_target.c
и внутри этого файлаESP_PLAFORM
не определено». — Компилировался ли когда-либо данный исходный файл во время сборки вашего проекта CMake? Насколько я знаю, регистрация компонента с помощьюidf_component_register(SRCS "main.c")
означает, что будет скомпилирован только исходный файлmain.c
.