Все, что ТРЕБУЕТСЯ, отсутствует в CMakeLists.txt

#linker #esp-idf #cmakelists-options

Вопрос:

Я обновляю проект с помощью ESP-IDF с версии 3.0.9 до версии 4.3 и исправляю устаревший код, чтобы у него была версия для компиляции.

Я установил VS Code pluign v1.1.0 и без проблем скомпилировал пример проекта.

Мой текущий список CMakeList выглядит примерно так

 idf_component_register(INCLUDE_DIRS "." "addrs" "button" "certs"
                       SRC_DIRS  "." "addrs" "button" "certs"
                       EMBED_TXTFILES "certs/ca.crt"
                       EMBED_FILES "web/bin/style.css.min.gz")
 

Теперь я исправляю код и сталкиваюсь с проблемой связывания, например

неопределенная ссылка на «mbedtls_md5_starts»

Компиляция, похоже, пойдет дальше, если я добавлю строку

 REQUIRES "mbedtls"
 

но внезапно я сталкиваюсь с проблемами с другими (nvs_flash, mdns, mqtt_client, …)

Со старой маркой у меня не было такой проблемы (не требуется эквивалент), поэтому я думаю, что мне следует настроить что-то получше. Должен ли я ТРЕБОВАТЬ все пакеты, или есть что-то, что нужно настроить, чтобы решить проблему?

Спасибо

Ответ №1:

Я почти уверен, что вам не нужно явно объявлять все свои зависимости — согласно документации по системе сборки ESP IDF, она по умолчанию пытается включить все компоненты.

Несмотря на это, я использую REQUIRES в своем проекте, чтобы сделать их явными (и, надеюсь, сократить время компиляции). В документе говорится, что, когда вы идете этим путем, вы должны следовать ему до конца, иначе он даже не будет включать соответствующие файлы заголовков, не говоря уже о коде для не включенных в список компонентов.

Хорошей новостью является то, что я почти уверен, что вам нужно перечислить только компоненты самого высокого уровня REQUIRES "nvs_flash" "mdns" "esp_http_client" , которые, в свою очередь, должны включать зависимости более низкого уровня, например mbedtls . В качестве примера, это в моих списках CMakeLists:

 ...
    REQUIRES
        "spi_flash"
        "nvs_flash"
        "gcp_iot_sdk"
        "wpa_supplicant"# This is already required by other components, but we
                        # explicitly require it for an include path to endian.h
        "app_update"    # OTA
        "esp_https_ota" # HTTPS OTA
        "esp_https_server"
        "httpd_basic_auth"
        "mdns"
        "json"
        "wear_levelling"# Wear levelling library for FAT file system
        "fatfs"         # File system
...