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

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,仅通过追加方式添加自定义编译参数,因此不会破坏交叉编译环境的默认配置。

修复步骤

  1. 修改根目录CMakeLists.txt的编译标志配置,禁止全量覆盖CMAKE_C_FLAGS,改为追加模式保留环境传入的默认参数:
    原有错误配置:
    set(CMAKE_C_FLAGS "-MMD -MP -O4 -fcommon")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
    
    修改为追加写法:
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MP -O4 -fcommon -std=gnu11")
    
    更符合CMake规范的写法是移除全局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)
    
  2. 检查所有层级CMakeLists.txt,确保不存在硬编码主机路径、修改CMAKE_SYSROOT/CMAKE_C_COMPILER等交叉编译核心变量的逻辑。
  3. 清理配方缓存后重新构建:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:21:32