Проблема конфигурации CMake в проекте STM32 – не удается включить заголовочный файл

Вопрос или проблема

Я новичок в работе с CMake, и мне нужна помощь в выяснении того, что я делаю не так. Я использую расширение STM32 для VS Code и сгенерировал новый пустой проект с помощью STM32Cube MX с выводом CMake. Пустой проект компилируется нормально, с этим проблем нет. Однако после того, как я добавил новую подпапку в Core под названием Modules, с двумя файлами: ModuleA.c и ModuleA.h, у меня возникли проблемы.

В моем CMakeLists.txt я включил новый модуль следующим образом:

# Добавить исходники в исполняемый файл
target_sources(${CMAKE_PROJECT_NAME} PRIVATE
   Core/Modules/ModuleA.c
)

# Добавить пути для включения
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
   ${CMAKE_SOURCE_DIR}/Core/Modules
)

Тем не менее, когда я пытаюсь вызвать тестовую функцию из ModuleA.c в main.c и включить ее с помощью #include ModuleA.h, компилятор выдает мне ошибку с сообщением: Нет такого файла или директории #include “ModuleA.h”

Что еще мне нужно изменить, чтобы это заработало? Нужно ли мне что-то менять в файле settings.json внутри папки .vscode, когда я добавляю новые файлы, или он должен обновляться автоматически?

Заранее спасибо за вашу помощь!

Core
│
├── Inc
│   └── main.h
│   └── stm32xx_hal_conf.h
│   └── stm32xx_it.h
│
├── Modules   //это папка, которую я добавил
│   └── ModuleA.h
│   └── ModuleA.c
│
└── Src
    └── main.c
    └── stm32xx_hal_msp.c
    └── system_stm32l0xx.c

Ответ или решение

Решение проблемы конфигурации CMake в проекте STM32: Не удается включить заголовочный файл

Ваша проблема с включением заголовочного файла ModuleA.h в проект STM32, сгенерированный с использованием CMake и STM32Cube MX, может быть связана с несколькими нюансами конфигурации CMake. Рассмотрим основные шаги для правильной настройки CMake и устранения возникшей ошибки.

Шаги для решения проблемы

  1. Проверка структуры проекта:
    Убедитесь, что структура вашего проекта верна и все файлы находятся в соответствующих папках. В вашем случае, размещение ModuleA.h и ModuleA.c в папке Core/Modules выглядит корректно.

  2. Подключение заголовочного файла:
    Убедитесь, что вы правильно используете директиву #include в файле main.c. В зависимости от путей, вы можете использовать один из следующих вариантов:

    #include "Modules/ModuleA.h" // относительно пути к файлу main.c

    или

    #include <ModuleA.h> // если правильно настроены пути инклюдов
  3. Правильная настройка CMakeLists.txt:
    Ваш CMakeLists.txt файл выглядит в целом правильно, однако следует убедиться, что вы добавили модуль Core/Modules/ModuleA.c и заголовочный файл корректно. Убедитесь, что target_include_directories и target_sources прописаны после объявления вашего target, например:

    # Создание исполняемой программы
    add_executable(${CMAKE_PROJECT_NAME} ${SOURCES})
    
    # Добавляем источники
    target_sources(${CMAKE_PROJECT_NAME} PRIVATE
       Core/Modules/ModuleA.c
       ... // другие исходные файлы
    )
    
    # Добавляем пути для заголовков
    target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
       ${CMAKE_SOURCE_DIR}/Core/Modules
       ${CMAKE_SOURCE_DIR}/Core/Inc // добавьте путь к папке Inc, если это необходимо
    )
  4. Пересборка проекта:
    После внесения изменений в CMakeLists.txt, обязательно пересоберите проект. Это можно сделать в терминале, выполнив команду:

    cmake --build .
  5. Проверка настроек VS Code:
    Настройки в файле settings.json должны обновляться автоматически. Однако, вам следует проверить, что конфигурации для IntelliSense корректно включают пути к вашим заголовочным файлам. Проверьте, чтобы в настройках был указан правильный путь:

    {
       "C_Cpp.default.includePath": [
           "${workspaceFolder}/Core/Modules",
           "${workspaceFolder}/Core/Inc"
       ]
    }
  6. Использование CMakeLists.txt в подкаталогах:
    Если ваш проект начнет расти, вы можете рассмотреть возможность использования отдельного CMakeLists.txt в папке Modules. Это может упростить управление зависимостями.

  7. Сброс кеша и чистка:
    Если после всех этих изменений проблема сохраняется, попробуйте очистить кеш CMake:

    rm -rf build/*

Вывод

Следуя этим шагам, вы должны устранить проблему с включением заголовочного файла в вашем проекте STM32. Помните, что правильная настройка путей и корректное определение исходников в CMake — это ключевые моменты для успешной сборки проекта. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться к сообществу или документации по CMake и STM32.

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

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