RPi Pico使用LWIP实现TCP/IP时缺失sys_arch.h文件求助
解决RPi Pico使用LWIP时找不到arch/sys_arch.h的编译错误
错误信息
In file included from /home/src/pico/pico-extras/lib/lwip/src/core/init.c:42: /home/src/pico/pico-extras/lib/lwip/src/include/lwip/sys.h:95:10: fatal error: arch/sys_arch.h: No such file or directory
问题原因
直接链接原生lwip库会绕过Pico针对RP2040的LWIP架构适配层,导致编译器找不到RP2040专属的sys_arch.h头文件;同时手动配置的include目录遗漏了架构相关路径。
修正后的CMakeLists.txt
cmake_minimum_required( VERSION 3.13 ) include( $ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake ) include( $ENV{PICO_EXTRAS_PATH}/external/pico_extras_import.cmake ) project( ds3231 C CXX ASM ) set( CMAKE_C_STANDARD 11 ) set( CMAKE_CXX_STANDARD 17 ) pico_sdk_init( ) set( SOURCES src/ds3231.cpp ) add_executable( ${CMAKE_PROJECT_NAME} ${SOURCES} ) pico_enable_stdio_usb( ${CMAKE_PROJECT_NAME} 1 ) pico_enable_stdio_uart( ${CMAKE_PROJECT_NAME} 0 ) pico_add_extra_outputs( ${CMAKE_PROJECT_NAME} ) # 保留项目自身和第三方库的include路径,移除手动添加的LWIP路径(由组件自动处理) include_directories( /home/src/pico/ds3231/src /home/src/pico/picolib/include ) # 给WIFI参数添加引号,避免带空格的SSID/密码导致编译错误 target_compile_definitions( ${CMAKE_PROJECT_NAME} PRIVATE WIFI_SSID="${WIFI_SSID}" WIFI_PASSWORD="${WIFI_PASSWORD}" ) target_compile_options( ${CMAKE_PROJECT_NAME} PRIVATE -Wall ) # 移除直接的lwip链接,pico_cyw43_arch_*组件已包含正确的LWIP依赖和配置 target_link_libraries( ${CMAKE_PROJECT_NAME} pico_stdlib hardware_i2c pico_cyw43_arch_lwip_threadsafe_background /home/src/pico/picolib/build/libpicolib.a )
关键修改说明
- 移除
lwip库链接:pico_cyw43_arch_lwip_threadsafe_background已经内置了适配RP2040的LWIP配置,包括必要的头文件路径和依赖库,单独链接原生lwip会导致架构适配缺失。 - 简化include目录:不需要手动添加LWIP的头文件路径,组件会自动引入所有LWIP核心及RP2040架构适配的头文件。
- 给WIFI参数加引号:如果SSID或密码包含空格,未加引号会导致编译时参数被拆分,引发语法错误。
内容的提问来源于stack exchange,提问作者Kevin Gilbert
相关产品推荐
相关产品推荐

