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

Raspberry Pi Pico项目CMake无法找到one_wire.h头文件问题

Raspberry Pi Pico DS18B20项目编译错误排查:找不到one_wire.h头文件

问题背景

基于Raspberry Pi Pico开发DS18B20温度读取项目时,已通过Git获取单总线库并存放至C:\SDK\pico-sdk\lib\MyProjectLib\pico_one_wire目录(该目录包含源码和头文件子目录)。使用CMake构建项目时,编译器可正常识别one_wire.cpp源文件,但始终无法找到one_wire.h头文件,编译报错:

C:\SDK\pico-sdk\Ryan_Paye\SeniorDesign\DS18B20\DS18B20.cpp:5:10: fatal error: one_wire.h: No such file or directory

已在CMake文件中添加include_directories(${PICO_SDK_PATH}/lib/MyProjectLib/pico_one_wire),但问题仍未解决。

当前CMake配置

cmake_minimum_required(VERSION 3.13)
include(pico_sdk_import.cmake)
project(DS18B20 C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

include_directories(${PICO_SDK_PATH}/lib/MyProjectLib/pico_one_wire)

pico_sdk_init()
add_executable(DS18B20
    DS18B20.cpp
    ${PICO_SDK_PATH}/lib/MyProjectLib/pico_one_wire/source/one_wire.cpp
)
pico_enable_stdio_usb(DS18B20 1)
pico_enable_stdio_uart(DS18B20 1)
pico_add_extra_outputs(DS18B20)
target_link_libraries(DS18B20 pico_stdlib hardware_gpio pico_one_wire)

编译日志关键信息

[  6%] Building CXX object CMakeFiles/DS18B20.dir/DS18B20.cpp.obj
C:\SDK\pico-sdk\Ryan_Paye\SeniorDesign\DS18B20\DS18B20.cpp:5:10: fatal error: one_wire.h: No such file or directory
    5 | #include "one_wire.h"
      |          ^~~~~~~~~~~~
compilation terminated.

错误原因排查与解决方法

1. 头文件路径指向错误

当前include_directories指定的是库的根目录,但one_wire.h实际存放在该目录下的头文件子目录(比如include文件夹)。编译器只会搜索指定目录下的文件,不会递归查找子目录,因此需要将路径修正为头文件所在的实际子目录:

# 假设头文件在pico_one_wire/include目录下
include_directories(${PICO_SDK_PATH}/lib/MyProjectLib/pico_one_wire/include)

2. CMake指令执行顺序问题

include_directories被放在pico_sdk_init()之前,部分场景下Pico SDK初始化会重置或覆盖路径配置。建议将include_directories移至pico_sdk_init()之后,确保路径被正确应用:

pico_sdk_init()
# 移到这里
include_directories(${PICO_SDK_PATH}/lib/MyProjectLib/pico_one_wire/include)

3. 库未正确定义导致路径关联失败

CMake配置中直接在add_executable里添加库的源文件,同时在target_link_libraries里写pico_one_wire,但该库并未通过add_library定义,导致CMake无法自动关联头文件路径。正确做法是先将单总线库编译为静态库,再链接到主项目:

# 在add_executable之前添加库定义
add_library(pico_one_wire STATIC
    ${PICO_SDK_PATH}/lib/MyProjectLib/pico_one_wire/source/one_wire.cpp
)
# 为库指定头文件路径(PUBLIC表示依赖该库的目标也会继承此路径)
target_include_directories(pico_one_wire PUBLIC
    ${PICO_SDK_PATH}/lib/MyProjectLib/pico_one_wire/include
)
# 链接库所需的依赖
target_link_libraries(pico_one_wire pico_stdlib hardware_gpio)

# 主项目只需要链接该库即可,无需重复添加源文件
add_executable(DS18B20
    DS18B20.cpp
)
target_link_libraries(DS18B20 pico_stdlib hardware_gpio pico_one_wire)

4. 头文件引用方式问题

如果暂时无法修改CMake配置,可以尝试调整代码中的#include语句,指定相对路径(不推荐硬编码,仅作为临时测试):

#include "../../../lib/MyProjectLib/pico_one_wire/include/one_wire.h"

内容的提问来源于stack exchange,提问作者Ryan Paye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:40:16