Компоновщик не находит реализацию, поскольку определение компилятора не оценивается в исходном коде

Я пытаюсь добавить эту библиотеку в свое приложение ESP-IDF в коде Visual Studio (не используя PlatformIO).

Вот шаг, который я сделал:

  1. создал новый проект с помощью «Мастера новых проектов» из расширения Espressif, выбрав ESP32-S3 в качестве цели
  2. создайте пустой проект, чтобы проверить, что с цепочкой инструментов все в порядке
  3. скачал вышеуказанную библиотеку в папке components/components/ в корне моего проекта
  4. добавьте код в 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?

«... находится внутри EVE_target.c и внутри этого файла ESP_PLAFORM не определено». — Компилировался ли когда-либо данный исходный файл во время сборки вашего проекта CMake? Насколько я знаю, регистрация компонента с помощью idf_component_register(SRCS "main.c") означает, что будет скомпилирован только исходный файл main.c.

Tsyvarev 10.04.2024 12:22

@Tsyvarev, возможно, это мое недоразумение: должен ли я вручную добавлять каждый файл .c, который у меня может быть в папке библиотеки, для idf_component_register() вызова?

Mark 10.04.2024 12:29

@Mark Да, но в отдельном файле компонента CMakeLists.txt см. мой ответ для получения дополнительной информации. Если есть файлы .c, которые не нужны для вашего случая использования (например, если они предназначены для других чипов, кроме ESP32-S3), вы, конечно, можете их пропустить.

StrawHat 19.04.2024 16:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В компоненте отсутствует файл 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, я не уверен, что система сборки все еще распознает компонент в текущей структуре.

Другие вопросы по теме