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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 10:24:53