“Неопределенная ссылка на” с использованием esp-idf

Вопросы и ответы

У меня проблема, как указано в заголовке, а именно:

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, если столкнетесь с трудностями. Удачи!

Оцените материал
Добавить комментарий

Капча загружается...