MacOS下CMake构建Arduino项目时avr-as遇-isysroot选项报错求助
解决MacOS下CMake构建Arduino项目时avr-as无法识别-isysroot选项的问题
问题
在MacOS系统上使用CMake/make构建Arduino C++项目时,系统会自动向avr-as传递-isysroot选项,但avr-as不支持该选项,导致构建失败。
错误日志
avr-as -I/Users/david/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/libraries/EEPROM/src -I/Users/david/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino -I/Users/david/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/variants/standard -I/Users/david/Library/Arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/avr/include -I/Users/david/C/arduino/avr-libstdcpp/include -isysroot /Applications/Xcode14.1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.0.sdk -o CMakeFiles/untitled.dir/Users/david/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/wiring_pulse.S.o -c /Users/david/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/wiring_pulse.S avr-as: unrecognized option `-isysroot' make[2]: *** [CMakeFiles/untitled.dir/Users/david/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/wiring_pulse.S.o] Error 1 make[1]: *** [CMakeFiles/untitled.dir/all] Error 2
当前CMakeLists.txt配置
cmake_minimum_required(VERSION 3.20) set(HAVE_FLAG_SEARCH_PATHS_FIRST 0) project(untitled) project(untitled LANGUAGES C CXX ASM) set(CMAKE_C_COMPILER avr-gcc) set(CMAKE_CXX_COMPILER avr-g++) set(CMAKE_ASM_COMPILER avr-as) set(CMAKE_C_COMPILER_FORCED 1) set(CMAKE_CXX_COMPILER_FORCED 1) #set(CMAKE_CXX_STANDARD 20) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) #sanitizers: address, thread, undefined, safe-stack set(CMAKE_CXX_FLAGS "-DF_CPU=16000000 -D__AVR_ATmega16U2__=1 -DTX_RX_LED_INIT=0 -DRXLED0=0 -DTXLED0=1 -DRXLED1=5 -DTXLED1=6 -DLED01=13 -DUSB_VID=0x2341 -DUSB_PID=0x0036 -usb_product=32u416m -mmcu=atmega2560 -O2") set(CMAKE_C_FLAGS "-DF_CPU=16000000 -D__AVR_ATmega16U2__=1 -DTX_RX_LED_INIT=0 -DRXLED0=0 -DTXLED0=1 -DRXLED1=5 -DTXLED1=6 -DLED01=13 -DUSB_VID=0x2341 -DUSB_PID=0x0036 -usb_product=32u416m -mmcu=atmega2560 -O2") set(CMAKE_ASM_FLAGS "") 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" "/Users/david/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/*.S" "main.cpp") 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")
解决方法
方法1:标记ASM编译器为强制交叉编译器并清空系统根目录
在CMakeLists.txt中添加以下配置,让CMake识别avr-as为交叉编译器,避免自动添加主机系统的-isysroot选项:
# 标记ASM编译器为强制使用,阻止CMake添加主机系统相关选项 set(CMAKE_ASM_COMPILER_FORCED 1) # 清空MacOS系统根目录配置,避免自动传递-isysroot set(CMAKE_OSX_SYSROOT "")
方法2:手动移除ASM_FLAGS中的-isysroot选项
如果方法1不生效,可直接从ASM编译选项中剔除-isysroot参数:
# 移除ASM编译选项中的-isysroot参数 string(REPLACE "-isysroot ${CMAKE_OSX_SYSROOT}" "" CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS}")
完整修改后的关键配置片段
补充上述配置后,CMakeLists.txt的编译器配置部分如下:
set(CMAKE_C_COMPILER avr-gcc) set(CMAKE_CXX_COMPILER avr-g++) set(CMAKE_ASM_COMPILER avr-as) set(CMAKE_C_COMPILER_FORCED 1) set(CMAKE_CXX_COMPILER_FORCED 1) set(CMAKE_ASM_COMPILER_FORCED 1) # 新增 set(CMAKE_OSX_SYSROOT "") # 新增 # 其他原有配置...
说明
MacOS下的CMake默认会向所有编译器自动添加-isysroot选项,用于指定主机系统SDK路径,但avr-as作为AVR架构的专用汇编器,不支持该选项。通过标记ASM编译器为强制交叉编译器或清空系统根目录配置,可阻止CMake自动添加该无效选项。
内容的提问来源于stack exchange,提问作者David Carpenter
相关产品推荐
相关产品推荐

