Yocto构建系统中Meson无法找到CMake导出头文件的问题求助
问题背景
在Yocto环境中,某软件包通过CMake导出头文件与配置信息,代码如下:
# 清理重复的头文件安装语句,保留其中一份即可 install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} FILES_MATCHING PATTERN *.h) # 安装库并导出目标 install(TARGETS ${LOCAL_MODULE} EXPORT ${LOCAL_EXPORT_TARGET} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) # 生成版本配置文件 set(LOCAL_CMAKE_CONFIG_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/${LOCAL_MODULE}) set(LOCAL_CONFIG_GEN_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated) set(LOCAL_VERSION_CONFIG ${LOCAL_CONFIG_GEN_DIR}/${LOCAL_MODULE}ConfigVersion.cmake) write_basic_package_version_file( ${LOCAL_VERSION_CONFIG} VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion) # 生成项目配置文件 set(LOCAL_EXPORT_DEPENDENCIES testcore) set(LOCAL_PROJECT_CONFIG ${LOCAL_CONFIG_GEN_DIR}/${LOCAL_MODULE}Config.cmake) configure_package_config_file( ${GLOBAL_CMAKE_DIR}/config.cmake.in ${LOCAL_PROJECT_CONFIG} INSTALL_DESTINATION ${LOCAL_CMAKE_CONFIG_INSTALL_DIR}) # 安装导出目标与配置文件 install(EXPORT ${LOCAL_EXPORT_TARGET} NAMESPACE ${GLOBAL_NAMESPACE}:: DESTINATION ${LOCAL_CMAKE_CONFIG_INSTALL_DIR}) install(FILES ${LOCAL_VERSION_CONFIG} ${LOCAL_PROJECT_CONFIG} DESTINATION ${LOCAL_CMAKE_CONFIG_INSTALL_DIR})
另一使用Meson构建的软件包当前通过硬编码路径查找头文件,且尝试dependency(test)查找失败,现有Meson代码:
dep_testcore = cpp.find_library('testcore', required: true) t_deps = [ dep_testcore ] common_inc += [ include_directories('.'), include_directories(join_paths(meson.current_build_dir(), '../../../recipe-sysroot/usr/include/internal/'))] testcommon = shared_library( 'testcommon', sources, include_directories: common_inc, dependencies: t_deps, link_args : t_link_args,install: true,)
解决方案
一、CMake端:完善包导出配置
修复
config.cmake.in模板文件
确保模板文件正确导出包含目录与依赖,示例内容如下:@PACKAGE_INIT@ # 导入导出的目标文件 include("${CMAKE_CURRENT_LIST_DIR}/@LOCAL_EXPORT_TARGET@.cmake") # 设置包的包含目录变量 set_and_check(@LOCAL_MODULE@_INCLUDE_DIRS "@PACKAGE_INCLUDE_DIR@") # 暴露包的库目标 set(@LOCAL_MODULE@_LIBRARIES @GLOBAL_NAMESPACE@::@LOCAL_MODULE@) # 自动查找依赖的testcore find_dependency(testcore)此模板会被
configure_package_config_file替换为实际路径,确保Meson能获取到头文件与依赖信息。验证头文件安装路径
确认CMake的install(DIRECTORY)语句正确将头文件安装到${CMAKE_INSTALL_INCLUDEDIR}下(Yocto中对应${SYSROOT}/usr/include),如果头文件存放在include/internal子目录,安装后路径应为usr/include/internal,代码中包含头文件时使用#include <internal/xxx.h>即可自动找到。
二、Meson端:移除硬编码并正确查找依赖
删除硬编码路径
直接移除include_directories(join_paths(meson.current_build_dir(), '../../../recipe-sysroot/usr/include/internal/')),依赖查找会自动提供头文件路径。使用CMake类型依赖查找
修改Meson代码,明确指定查找CMake导出的包,自动获取头文件、库与依赖:# 查找CMake导出的test包(名称需与CMake中${LOCAL_MODULE}一致) dep_test = dependency('test', type: 'cmake', required: true) # testcore依赖会被test包自动导入,无需单独查找 t_deps = [dep_test] common_inc = [include_directories('.')] testcommon = shared_library( 'testcommon', sources, include_directories: common_inc, dependencies: t_deps, link_args: t_link_args, install: true, )Yocto环境变量适配(可选)
若Meson仍无法找到包,可在对应软件包的.bbappend文件中添加环境变量配置:EXTRA_OEMESON += "-Dcmake_prefix_path=${RECIPE_SYSROOT}/usr/lib/cmake"
排查要点
- 确认CMake生成的
${LOCAL_MODULE}Config.cmake文件存在于${SYSROOT}/usr/lib/cmake/${LOCAL_MODULE}目录下,且内容正确。 - 检查CMake中
LOCAL_MODULE的变量值与Mesondependency()中的名称完全一致。 - 验证头文件已正确安装到Yocto sysroot的对应路径中。
内容的提问来源于stack exchange,提问作者noman pouigt

