Yocto构建时CMake无法找到libc++标准头文件报错求助
Yocto构建C++标准头文件包含错误排查
问题描述
在使用Yocto Recipe构建项目时,CMakeLists.txt触发C标准头文件包含错误:<cstdint>尝试包含<stdint.h>时,找不到libc的<stdint.h>头文件,提示头文件搜索路径配置不当,C++标准库头文件路径优先级低于C标准库。
相关配置文件
CMakeLists.txt
cmake_minimum_required(VERSION 3.22) project(libproj) set(CMAKE_BUILD_TYPE "Debug") if(CMAKE_BUILD_TYPE STREQUAL "Debug") message(STATUS "Building in Debug mode") add_compile_definitions(DEBUG=1) else() message(STATUS "Building in Release mode") add_compile_definitions(NDEBUG=1) endif() set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_SKIP_BUILD_RPATH FALSE) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) set(CMAKE_INSTALL_RPATH "${ORIGIN}") set(VERSION "1.1.1") string(REPLACE "." ";" ver_list ${VERSION}) list(GET ver_list 0 LIB_MAJOR) list(GET ver_list 1 LIB_MINOR) # Shared vs Static (LIB_TYPE) option(BUILD_SHARED_LIBS "Build shared libraries" ON) include(GNUInstallDirs) set(TARGET_NAME proj_lib) set(TARGET_ALIAS_NAME proj-lib) set(SRC src/abc.cpp gen/src/def.cpp ) add_library(${TARGET_NAME} ${SRC}) add_library(${PROJECT_NAME}::${TARGET_ALIAS_NAME} ALIAS ${TARGET_NAME}) set_target_properties( ${TARGET_NAME} PROPERTIES EXPORT_NAME ${TARGET_ALIAS_NAME} INSTALL_RPATH "${CMAKE_INSTALL_RPATH}" ) target_include_directories( ${TARGET_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/inc> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/gen/src> $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> ) set_target_properties( ${TARGET_NAME} PROPERTIES OUTPUT_NAME ${TARGET_NAME} VERSION "${VERSION}" SOVERSION "${LIB_MAJOR}.${LIB_MINOR}" ) install( TARGETS ${TARGET_NAME} EXPORT libproj_targets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) install( DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/gen" "${CMAKE_CURRENT_SOURCE_DIR}/inc" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}-${TARGET_ALIAS_NAME}" FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" ) install( EXPORT libproj_targets FILE libproj_targets.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} NAMESPACE ${PROJECT_NAME}:: ) include(CMakePackageConfigHelpers) configure_package_config_file( "cmake/libproj_config.cmake.in" "libproj-config.cmake" INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} PATH_VARS CMAKE_INSTALL_LIBDIR ) write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/libproj-version.cmake VERSION ${VERSION} COMPATIBILITY SameMajorVersion ) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/libproj-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/libproj-version.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" )
abc.bb
SUMMARY = "ABC" DESCRIPTION = "ABC" inherit cmake inherit ${@'qnx-includes' if d.getVar('BUILD_PLATFORM') == 'QNX' else ''} # build components reside in submodule SRC_URI = "gitsm://github.abc.com/repos/proj;branch=main;protocol=https" SRCREV_FORMAT = "proj" SRCREV = "${AUTOREV}" S = "${WORKDIR}/git/proj" B = "${S}" # build steps using CMake EXTRA_OECMAKE:remove:qnx = " -DTARGET_OS=LINUX " EXTRA_OECMAKE:append:qnx = " -DTARGET_OS=QNX " SOLIBS = ".so" FILES_SOLIBSDEV = "" FILES:${PN}-dev += "${libdir}/libproj*.so" FILES:${PN} += " \n ${libdir}/libproj* \n"
错误信息
In file included from /home/sid_sva_mi/poky/build/tmp/work/cortexa57-poky-linux/proj/dev_qwerty/git/proj/src/abc.cpp:3: 2026-03-13T09:48:57 | /opt/qnx800/target/qnx/usr/include/c++/v1/cstdint:149:5: error: #error <cstdint> tried including <stdint.h> but didn't find libc++'s <stdint.h> header. This usually means that your header search paths are not configured properly. The header search paths should contain the C++ Standard Library headers before any C Standard Library, and you are probably using compiler flags that make that not be the case. 2026-03-13T09:48:57 | 149 | # error <cstdint> tried including <stdint.h> but didn't find libc++'s <stdint.h> header. \n
解决方案
1. 调整QNX平台的编译头文件优先级
错误核心是C标准库头文件路径未优先于C标准库,在abc.bb中添加QNX专属编译标志,强制指定libc头目录在前:
CXXFLAGS:append:qnx = " -isystem /opt/qnx800/target/qnx/usr/include/c++/v1 -isystem /opt/qnx800/target/qnx/usr/include"
或者通过CMake传递编译参数:
EXTRA_OECMAKE:append:qnx = " -DCMAKE_CXX_FLAGS='-isystem /opt/qnx800/target/qnx/usr/include/c++/v1 -isystem /opt/qnx800/target/qnx/usr/include'"
2. 禁用源码内构建
当前Recipe设置B = "${S}"(源码目录内构建)可能干扰CMake的头文件搜索逻辑,改为单独的构建目录:
B = "${WORKDIR}/build"
3. 确认QNX工具链配置
- 确保Yocto使用的QNX交叉工具链默认采用libc作为C标准库,而非GNU libstdc++
- 检查工具链的sysroot是否包含完整的libc++头文件,路径对应
/opt/qnx800/target/qnx/usr/include/c++/v1
4. 优化CMakeLists.txt的头文件配置
在CMakeLists.txt开头添加libc++头目录的强制包含,确保优先级:
if(CMAKE_SYSTEM_NAME STREQUAL "QNX") include_directories(SYSTEM BEFORE "/opt/qnx800/target/qnx/usr/include/c++/v1") endif()
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

