Вопрос или проблема
Я новичок в работе с 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 и устранения возникшей ошибки.
Шаги для решения проблемы
-
Проверка структуры проекта:
Убедитесь, что структура вашего проекта верна и все файлы находятся в соответствующих папках. В вашем случае, размещениеModuleA.h
иModuleA.c
в папкеCore/Modules
выглядит корректно. -
Подключение заголовочного файла:
Убедитесь, что вы правильно используете директиву#include
в файлеmain.c
. В зависимости от путей, вы можете использовать один из следующих вариантов:#include "Modules/ModuleA.h" // относительно пути к файлу main.c
или
#include <ModuleA.h> // если правильно настроены пути инклюдов
-
Правильная настройка 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, если это необходимо )
-
Пересборка проекта:
После внесения изменений вCMakeLists.txt
, обязательно пересоберите проект. Это можно сделать в терминале, выполнив команду:cmake --build .
-
Проверка настроек VS Code:
Настройки в файлеsettings.json
должны обновляться автоматически. Однако, вам следует проверить, что конфигурации для IntelliSense корректно включают пути к вашим заголовочным файлам. Проверьте, чтобы в настройках был указан правильный путь:{ "C_Cpp.default.includePath": [ "${workspaceFolder}/Core/Modules", "${workspaceFolder}/Core/Inc" ] }
-
Использование
CMakeLists.txt
в подкаталогах:
Если ваш проект начнет расти, вы можете рассмотреть возможность использования отдельногоCMakeLists.txt
в папкеModules
. Это может упростить управление зависимостями. -
Сброс кеша и чистка:
Если после всех этих изменений проблема сохраняется, попробуйте очистить кеш CMake:rm -rf build/*
Вывод
Следуя этим шагам, вы должны устранить проблему с включением заголовочного файла в вашем проекте STM32. Помните, что правильная настройка путей и корректное определение исходников в CMake — это ключевые моменты для успешной сборки проекта. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться к сообществу или документации по CMake и STM32.