У меня проблема, как указано в заголовке, а именно:
main/
├── app/
│ ├── CMakeLists.txt
│ ├── led_blink.c
│ ├── led_blink.h
├── common/
│ ├── defines.h
│ ├── includes.h
│ ├── libraries.h
├── main.c
├── CMakeLists.txt
├── .gitignore
├── README.md
├── sdkconfig
В моем файле common/defines.h:
#define LED_PIN 2
В моем файле common/includes.h:
#include "libraries.h"
#include "defines.h"
В моем файле common/libraries.h:
#include <stdio.h>
#include "driver/gpio.h"
#include "app/led_blink.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
В моем файле app/led_blink.c:
#include "led_blink.h"
static uint8_t s_led_state = 0;
void blink_led(void)
{
gpio_set_level(LED_PIN, s_led_state);
s_led_state = !s_led_state;
// Задержка на 1000 миллисекунд (1 секунда)
vTaskDelay(pdMS_TO_TICKS(1000));
}
void configure_led(void)
{
gpio_reset_pin(LED_PIN);
/* Установить GPIO как выход с высоким/низким уровнем */
gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);
}
В моем файле app/led_blink.h:
void blink_led(void);
void configure_led(void);
В моем файле main.c:
#include "common/includes.h"
void app_main(void)
{
configure_led();
while (1)
{
blink_led();
}
}
Это файлы CMake:
app/CMakeLists.txt:
idf_component_register(SRCS "led_blink.c"
INCLUDE_DIRS "." "../common")
main/CMakeLists.txt:
idf_component_register(SRCS "main.c"
INCLUDE_DIRS "." "common" "app" )
Это журнал проблемы:
.../main/libmain.a(main.c.obj):(.literal.app_main+0x0): неопределенная ссылка на `configure_led'
.../main/libmain.a(main.c.obj):(.literal.app_main+0x4): неопределенная ссылка на `blink_led'
...main/main.c:5:(.text.app_main+0x3): неопределенная ссылка на `configure_led'
.../main/main.c:8:(.text.app_main+0x9): неопределенная ссылка на `blink_led'
Я пытался прочитать документацию по ESP-idf, но это не помогло. Можете ли вы помочь мне, заранее спасибо!
Ответ
Проблема, с которой вы столкнулись, связана с тем, что функции configure_led
и blink_led
, объявленные в вашем файле led_blink.c
, не могут быть найдены компилятором во время линковки. Это может происходить по нескольким причинам, и ниже приведены шаги, чтобы устранить эту ошибку.
1. Корректировка структуры проекта
Ваша структура проекта выглядит логично, однако вы должны убедиться, что папка app
и ее содержимое правильно интегрированы в сборку проекта. Проверьте следующие пункты:
2. Файл CMakeLists.txt в приложении
Убедитесь, что ваш файл CMakeLists.txt
в папке app
правильно объявляет свои исходные файлы и директории включений. У вас уже есть:
idf_component_register(SRCS "led_blink.c"
INCLUDE_DIRS "." "../common")
3. Правильная конфигурация главного CMakeLists.txt
Файл CMakeLists.txt
в папке main
тоже должен правильно ссылаться на компоненты. Ваш код выглядит так:
idf_component_register(SRCS "main.c"
INCLUDE_DIRS "." "common" "app")
Однако, чтобы правильно подключить компонент app
, вы должны добавить зависимость от компонента app
. Измените код следующим образом:
idf_component_register(SRCS "main.c"
INCLUDE_DIRS "."
REQUIRES app)
Таким образом, вы указываете, что компонент main
зависит от компонента app
.
4. Проверка имен и областей видимости функций
Убедитесь, что функции configure_led
и blink_led
действительно видны. Они объявлены как глобальные, используйте extern
в заголовочном файле led_blink.h
для явного указания на то, что они будут использоваться из других файлов. Но в вашем случае все правильно.
5. Чистка и сборка проекта
После внесения изменений не забудьте очистить ваш проект и пересобрать его. Выполните следующие команды:
idf.py fullclean
idf.py build
6. Проверка ошибок во время сборки
Если после всех вышеперечисленных шагов ошибка не пропала, обратите внимание на полные сообщения об ошибках и откройте их в поисках дополнительных подсказок.
7. Запуск
После успешной сборки используйте команду:
idf.py -p (ваш_порт) flash monitor
вместо (ваш_порт)
укажите порт, к которому подключен ваш ESP32.
Заключение
Если вы выполните все вышеперечисленные шаги, ваша проблема с "undefined reference to" должна быть решена. Если же ошибки продолжают появляться, возможно, есть более редкие нюансы в конфигурациях, которые требуют дополнительного внимания. Не стесняйтесь задавать вопросы на форумах сообщества ESP-IDF, если столкнетесь с трудностями. Удачи!