You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Raspberry Pi Pico SDK中添加源文件?CMake配置及替代方案咨询

Raspberry Pi Pico多文件项目CMake配置指南

一、基础多文件拆分的核心修改

你的问题根源是未将新增的.c文件纳入CMake编译目标,头文件找不到则是因为CMake未把对应目录加入头文件搜索路径(或VS Code智能感知未同步配置)。

1. 单目录下的文件拆分

假设项目结构:

torch_project/
├── CMakeLists.txt
├── torch.c
├── i2c.c
└── i2c.h

默认的Pico CMake模板仅包含主文件,需修改两处:

  • 将所有待编译的.c文件添加到add_executable
    add_executable(torch torch.c i2c.c)
    
  • 显式添加当前目录到头文件搜索路径(解决VS Code头文件识别问题):
    target_include_directories(torch PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
    

2. 按功能分文件夹的配置

若要将I2C代码放到独立文件夹:

torch_project/
├── CMakeLists.txt
├── torch.c
└── i2c/
    ├── i2c.c
    └── i2c.h

修改主CMakeLists.txt:

# 直接指定子目录下的源文件
add_executable(torch torch.c i2c/i2c.c)
# 添加i2c目录到头文件搜索路径
target_include_directories(torch PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/i2c)

也可批量收集子目录文件(适合文件较多的场景):

file(GLOB I2C_SOURCES i2c/*.c)
add_executable(torch torch.c ${I2C_SOURCES})

二、VS Code中GPIO_FUNC_I2C波浪线的解决

这是VS Code智能感知未同步CMake配置导致的:

  • 确保已安装Pico官方VS Code插件,右下角状态栏显示正确的CMake编译目标
  • Ctrl+Shift+P执行CMake: Configure,让编辑器重新读取CMake配置,智能感知会自动更新路径

三、关于嵌套CMakeLists.txt的误解

嵌套CMakeLists.txt并非必须,仅当你需要将某部分代码封装为可复用的静态库时才需要。如果只是单纯的文件组织结构,直接在主CMakeLists.txt中添加文件路径即可。

若要将I2C代码封装为静态库(适合多项目复用),可在i2c目录下新建CMakeLists.txt:

add_library(i2c_lib STATIC i2c.c)
target_include_directories(i2c_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(i2c_lib pico_stdlib hardware_i2c)

然后在主CMakeLists.txt中添加:

add_subdirectory(i2c)
add_executable(torch torch.c)
target_link_libraries(torch pico_stdlib i2c_lib)

四、CMake的必要性与普通Makefile的可行性

为什么用CMake?

Pico SDK本身基于CMake构建,它封装了交叉编译工具链、硬件外设依赖、链接脚本等复杂配置,无需手动维护这些底层细节,是官方推荐的标准化构建方式,能大幅降低出错概率。

能不能用普通Makefile?

可以,但不推荐。你需要手动编写交叉编译规则,指定ARM工具链路径、SDK头文件/库路径、链接脚本等,示例如下(需根据实际路径调整):

CC = arm-none-eabi-gcc
CFLAGS = -mcpu=cortex-m0plus -mthumb -O0 -g -Wall \
         -I$(PICO_SDK_PATH)/src/rp2040/hardware_regs/include \
         -I$(PICO_SDK_PATH)/src/rp2040/hardware_structs/include \
         -I$(PICO_SDK_PATH)/src/common/pico_stdlib/include
LDFLAGS = -T$(PICO_SDK_PATH)/src/rp2040/linker_scripts/rp2040.ld \
          -L$(PICO_SDK_PATH)/build/lib -lpico_stdlib -lhardware_i2c

all: torch.elf

torch.elf: torch.o i2c.o
	$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)

torch.o: torch.c
	$(CC) $(CFLAGS) -c $< -o $@

i2c.o: i2c.c
	$(CC) $(CFLAGS) -c $< -o $@

clean:
	rm -f *.o *.elf

这种方式需要手动维护所有SDK依赖,SDK更新后需同步修改Makefile,效率远低于CMake。

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

火山引擎 最新活动