Raspberry Pi Pico项目CMake无法找到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

