You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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,提问作者황인규

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:29:54