如何配置CMake使STM32自定义库头文件支持目录式引用?
问题描述
将STM32 VSCode扩展更新至2.0后,使用VSCode进行STM32开发。此前通过CMakeLists.txt添加自定义库并不复杂,但现在希望将添加的库打包为一个目录,实现头文件以<test/types.h>的形式引用(当前为直接引用<types.h>)。附上项目目录结构及CMake配置文件,请求解决该问题。
当前引用方式
#include <types.h> #include <test.h>
期望引用方式
#include <test/types.h> #include <test/test.h>
项目目录结构
. ├── CMakeLists.txt ├── CMakePresets.json ├── Core │ ├── Inc │ │ ├── FreeRTOSConfig.h │ │ ├── gpio.h │ │ ├── main.h │ │ └── usart.h │ └── Src │ ├── freertos.c │ ├── gpio.c │ ├── main.c │ ├── syscalls.c │ ├── sysmem.c │ ├── system_stm32f4xx.c │ └── usart.c ├── Middlewares │ └── Test │ ├── CMakeLists.txt │ ├── Inc │ │ ├── types.h │ │ └── test.h │ └── Src ├── STM32F429ZITx_FLASH.ld ├── stm32_test.ioc ├── cmake │ └── gcc-arm-none-eabi.cmake └── startup_stm32f429xx.s
根目录 ./CMakeLists.txt
cmake_minimum_required(VERSION 3.22) # # This file is generated only once, # and is not re-generated if converter is called multiple times. # # User is free to modify the file as much as necessary # # Setup compiler settings set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS ON) # Define the build type if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Debug") endif() # Set the project name set(CMAKE_PROJECT_NAME stm32_test) # Include toolchain file include("cmake/gcc-arm-none-eabi.cmake") # Enable compile command to ease indexing with e.g. clangd set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE) # Enable CMake support for ASM and C languages enable_language(C ASM) # Core project settings project(${CMAKE_PROJECT_NAME}) message("Build type: " ${CMAKE_BUILD_TYPE}) # Create an executable object type add_executable(${CMAKE_PROJECT_NAME}) # Add STM32CubeMX generated sources add_subdirectory(cmake/stm32cubemx) # Add UltraSonic library add_subdirectory(Middlewares/UltraSonic) # Link directories setup target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE # Add user defined library search paths ) # Link options target_link_options(${CMAKE_PROJECT_NAME} PRIVATE -u _printf_float # to print float values ) # Add sources to executable target_sources(${CMAKE_PROJECT_NAME} PRIVATE # Add user sources here ) # Add include paths target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE # Add user defined include paths ) # Add project symbols (macros) target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE # Add user defined symbols ) # Add linked libraries target_link_libraries(${CMAKE_PROJECT_NAME} stm32cubemx test # Add user defined libraries )
./Middlewares/Test/CMakeLists.txt
cmake_minimum_required(VERSION 3.22) # Enable CMake support for ASM and C languages enable_language(C ASM) # Core project settings project( test LANGUAGES CXX VERSION 1.0.0 ) add_library(test INTERFACE) # Add include paths target_include_directories(test INTERFACE Inc # Add user defined include paths ) message(STATUS "test")
解决方案
要实现<test/types.h>这种带目录前缀的引用方式,需按以下步骤调整:
1. 调整库的目录结构
在Middlewares/Test/Inc下新建test子目录,将types.h和test.h移动到该子目录中。调整后目录结构如下:
Middlewares └── Test ├── CMakeLists.txt ├── Inc │ └── test │ ├── types.h │ └── test.h └── Src
2. 修改库的CMake配置
打开Middlewares/Test/CMakeLists.txt,修改target_include_directories的路径,将原有的Inc替换为../(指向Middlewares目录),让编译器能识别到test作为头文件的顶层目录:
target_include_directories(test INTERFACE ../ )
也可以用CMAKE_CURRENT_SOURCE_DIR确保路径可靠,避免层级混乱:
target_include_directories(test INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/../ )
3. 验证引用
修改完成后,即可在代码中使用期望的方式引用头文件:
#include <test/types.h> #include <test/test.h>
内容的提问来源于stack exchange,提问作者황인규
相关产品推荐
相关产品推荐

