Yocto Bitbake编译报错include_next <stdint.h>找不到文件排查
BitBake构建本地CMake项目时
stdint.h缺失(include_next报错)修复 问题现象
- 编写BitBake配方构建本地存储的C语言CMake项目,无远程源码拉取逻辑,预期构建输出镜像包含项目生成的可执行文件、共享库,项目共包含3层CMakeLists.txt配置
- 前置验证均通过:
- 脱离BitBake环境,源码可直接在开发主机、目标设备上通过CMake完成编译
- .bb配方中已通过
OECMAKE_SOURCEPATH正确配置源码路径 - 默认
do_compile()任务可正常触发CMake构建流程
- 构建在
do_compile()阶段失败,核心报错为GCC包装头通过include_next指令查找下一级stdint.h失败,报错片段:
/home/myname/project/nxp_s32/build_s32g274asbc2/tmp/work/aarch64-ms-linux/embitel-uds/1.0.0-r0/recipe-sysroot-native/usr/lib/aarch64-ms-linux/gcc/aarch64-ms-linux/10.2.0/include/stdint.h:9:16: fatal error: stdint.h: No such file or directory 9 | # include_next <stdint.h> | ^~~~~~~~~~ compilation terminated.
- 已确认
stdint.h文件在sysroot中实际存在,使用同一交叉编译器构建同目标环境其他项目无同类问题,配方配置变量与其他正常构建的软件包完全一致,对比CMake缓存、日志文件后定位问题范围为项目自身CMakeLists.txt未适配交叉编译场景,已尝试添加-DCMAKE_NO_SYSTEM_FROM_IMPORTED=1参数、避免配方中硬编码交叉编译器路径,均未解决。
根因
根目录CMakeLists.txt中直接通过set(CMAKE_C_FLAGS "...")全量覆盖了编译标志变量,冲掉了Yocto/OE构建环境默认注入的交叉编译必要参数,最关键的是丢失了目标sysroot的头文件搜索路径参数--sysroot=<target-sysroot-path>。
GCC的stdint.h采用包装头实现:首先搜索到GCC自带目录下的包装版stdint.h,再通过include_next指令到目标sysroot的系统头文件目录加载真正的平台适配stdint.h。当sysroot路径未传入编译命令时,GCC无法找到目标系统的真实头文件,直接触发报错。
其他可正常构建的项目均未全量覆盖CMAKE_C_FLAGS,仅通过追加方式添加自定义编译参数,因此不会破坏交叉编译环境的默认配置。
修复步骤
- 修改根目录CMakeLists.txt的编译标志配置,禁止全量覆盖
CMAKE_C_FLAGS,改为追加模式保留环境传入的默认参数:
原有错误配置:
修改为追加写法:set(CMAKE_C_FLAGS "-MMD -MP -O4 -fcommon") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
更符合CMake规范的写法是移除全局set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MP -O4 -fcommon -std=gnu11")CMAKE_C_FLAGS配置,将编译选项绑定到具体构建目标,避免全局参数污染:target_compile_options(uds-server PRIVATE -MMD -MP -O4 -fcommon -std=gnu11) target_compile_options(udsserver PRIVATE -MMD -MP -O4 -fcommon -std=gnu11) - 检查所有层级CMakeLists.txt,确保不存在硬编码主机路径、修改
CMAKE_SYSROOT/CMAKE_C_COMPILER等交叉编译核心变量的逻辑。 - 清理配方缓存后重新构建:
bitbake -c cleansstate embitel-uds bitbake embitel-uds
原项目CMakeLists.txt参考
根目录CMakeLists.txt
cmake_minimum_required(VERSION 3.13) project("MyUDS" VERSION "1.0.0" LANGUAGES C) include(GNUInstallDirs) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS OFF) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # 注意:此处原有全量赋值CMAKE_C_FLAGS的写法会破坏交叉编译参数 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MP -O4 -fcommon -std=gnu11") set(PROJECT_VERSION_MAJOR 0 CACHE STRING "") set(PROJECT_VERSION_MINOR 0 CACHE STRING "") set(PROJECT_VERSION_PATCH 0 CACHE STRING "") set(PROJECT_VERSION_BUILD 0 CACHE STRING "") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) add_library(uds-server SHARED) set_target_properties(uds-server PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) add_subdirectory(src/3rdparty/udsdoip)
src/3rdparty/udsdoip/CMakeLists.txt
file(GLOB_RECURSE sched_sources ${CMAKE_CURRENT_SOURCE_DIR}/UDSSrvonDOIP/DoIPSrvProcess/Sched/*.c) add_executable(udsserver ${sched_sources}) target_link_libraries(udsserver uds-server pthread) target_include_directories( udsserver PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/UDSSrvonDOIP/DoIPSrvProcess/Inc ${CMAKE_CURRENT_SOURCE_DIR}/UDSSrvonDOIP/DoIPSrvProcess/Sched/Inc ${CMAKE_CURRENT_SOURCE_DIR}/UDSSrvonDOIP/DoIPSrvProcess/Src/Inc ) add_subdirectory(UDSSrvonDOIP/DoIPSrvProcess) install(TARGETS udsserver DESTINATION bin) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/service/uds_server.sh DESTINATION bin) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/service/uds_server.service DESTINATION /etc/systemd/system )
src/3rdparty/udsdoip/UDSSrvonDOIP/DoIPSrvProcess/CMakeLists.txt
project(lib-uds-server) target_compile_definitions( uds-server PUBLIC DEBUG_SOCKCOMM DOIP_SERVER_PRINT_TCP_RX_PACKET_DATA DOIP_SERVER_PRINT_FOUND_NET_DEVS ) file(GLOB_RECURSE isouds_sources RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.c) target_sources(uds-server PRIVATE ${isouds_sources}) target_include_directories( uds-server PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Inc ${CMAKE_CURRENT_SOURCE_DIR}/Sched ${CMAKE_CURRENT_SOURCE_DIR}/Sched/Inc ${CMAKE_CURRENT_SOURCE_DIR}/Src/ISOUDS/ISOUDSSecurDtaTrans ) install(TARGETS uds-server ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
内容的提问来源于stack exchange,提问作者raclette525
相关产品推荐
相关产品推荐

