使用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
相关产品推荐
相关产品推荐

