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

使用CMake构建Arduino项目时出现USB_VID未定义错误求助

问题:CMake构建Arduino项目时出现USB_VID未定义错误,及无IDE构建资料需求

问题背景

尝试用CMake替代Arduino IDE构建Arduino项目,为避免AVR核心中main.cpp与自定义main.cpp冲突,将AVR核心路径下的/Users/david/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/main.cpp重命名为main.cc,编写的CMake配置如下:

cmake_minimum_required(VERSION 3.20)

set(HAVE_FLAG_SEARCH_PATHS_FIRST 0)

set(CMAKE_C_COMPILER avr-gcc)
set(CMAKE_CXX_COMPILER avr-g++)

set(CMAKE_C_COMPILER_FORCED 1)
set(CMAKE_CXX_COMPILER_FORCED 1)

set(CMAKE_CXX_STANDARD 20)
project(untitled)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

set(CMAKE_CXX_FLAGS "-DF_CPU=16000000 -D__AVR_ATmega16U2__=1 -mmcu=atmega2560 -O2")
set(CMAKE_C_FLAGS "-DF_CPU=16000000 -D__AVR_ATmega16U2__=1 -mmcu=atmega2560 -O2")

file(GLOB SOURCES "/Users/david/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/*.cpp" "/Users/david/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/*.c" "main.cpp")

#list(FILTER SOURCES EXCLUDE REGEX "*main\.cpp")
#https://stackoverflow.com/a/49377205/983556

#list(REMOVE_ITEM SOURCES "main.cpp")

#file(GLOB SOURCES "./*.cpp")
add_definitions(-D__AVR_ATmega16U2__)
add_executable(untitled ${SOURCES})

# changes c++ standard from gnu++YEAR to c++YEAR
# seems to fix issues using bear and clangd
set_target_properties(untitled PROPERTIES CXX_EXTENSIONS OFF)

target_include_directories(untitled PUBLIC "/Users/david/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/libraries/EEPROM/src/")
target_include_directories(untitled PUBLIC "/Users/david/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/")
target_include_directories(untitled PUBLIC "/Users/david/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/variants/standard")
target_include_directories(untitled PUBLIC "/Users/david/Library/Arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/avr/include/")
target_include_directories(untitled PUBLIC "/Users/david/C/arduino/avr-libstdcpp/include")

运行CMake时出现编译错误:

/Users/david/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/USBCore.cpp:75:29: error: 'USB_VID' was not declared in this scope
   75 |  D_DEVICE(0xEF,0x02,0x01,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,ISERIAL,1);

错误修复方案

1. 补充USB_VID和USB_PID宏定义

USB_VID(厂商ID)和USB_PID(产品ID)是Arduino USB核心依赖的必填宏,需在CMake中明确定义:

  • 直接追加到编译选项中(以Arduino Mega 2560默认VID/PID为例,可根据板型调整):
    set(CMAKE_CXX_FLAGS "-DF_CPU=16000000 -mmcu=atmega2560 -O2 -DUSB_VID=0x2341 -DUSB_PID=0x0042")
    set(CMAKE_C_FLAGS "-DF_CPU=16000000 -mmcu=atmega2560 -O2 -DUSB_VID=0x2341 -DUSB_PID=0x0042")
    
  • 或通过add_definitions添加:
    add_definitions(-DUSB_VID=0x2341 -DUSB_PID=0x0042)
    

2. 修正板型定义冲突

当前CMake中同时定义了__AVR_ATmega16U2__和-mmcu=atmega2560,二者矛盾:

  • ATmega16U2是Arduino板上的USB转串口芯片,而非主控制芯片atmega2560,需删除-D__AVR_ATmega16U2__=1及对应的add_definitions行,确保编译目标与MCU一致。

3. 稳妥处理AVR核心main文件

不建议修改Arduino核心原文件,改用CMake过滤掉核心中的main.cpp:
取消注释以下代码即可:

list(FILTER SOURCES EXCLUDE REGEX ".*main\\.cpp$")

无IDE构建Arduino项目的可靠资料

  • Arduino官方CLI工具:官方推出的命令行工具,支持编译、上传、依赖管理等全流程,可配合CMake获取板型配置与核心依赖。
  • AVR-GCC官方文档:掌握-mmcu、-DF_CPU等AVR编译基础参数,是手动构建的核心。
  • 社区CMake-Arduino模板:开发者维护的成熟配置模板,涵盖多板型、多核心的依赖管理,可直接参考适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 18:12:43