Yocto编译Recipe遇CMake find_package错误,单独运行CMake正常
解决Yocto Project构建pigpio程序时CMake找不到库的问题
问题根源
本地CMake编译正常,但Yocto交叉编译失败,核心原因有三点:
- 路径硬编码不匹配:你提供的
Findpigpio.cmake固定搜索/usr/local路径,但Yocto交叉编译时,所有依赖文件都存放在recipe-sysroot目录下,而非主机系统的/usr/local。 - 本地相对路径无效:CMakeLists.txt中用
${PROJECT_SOURCE_DIR}指定的pigpio路径是本地开发路径,Yocto构建时工作目录切换到tmp/work下,该路径完全无效。 - 未利用Yocto交叉编译环境变量:没有借助Yocto自动设置的
CMAKE_SYSROOT变量引导CMake搜索正确的依赖位置。
具体修复步骤
1. 修改Findpigpio.cmake适配Yocto环境
替换原文件内容,让CMake优先搜索Yocto的sysroot路径,同时简化库名搜索(find_library会自动补全lib前缀和.so后缀):
################################################################################ ### Find the pigpio shared libraries. ################################################################################ # 基于Yocto的sysroot搜索头文件 find_path(pigpio_INCLUDE_DIR NAMES pigpio.h pigpiod_if.h pigpiod_if2.h HINTS ${CMAKE_SYSROOT}/usr/include ${CMAKE_SYSROOT}/usr/local/include) # 基于Yocto的sysroot搜索库文件 find_library(pigpio_LIBRARY NAMES pigpio HINTS ${CMAKE_SYSROOT}/usr/lib ${CMAKE_SYSROOT}/usr/local/lib) find_library(pigpiod_if_LIBRARY NAMES pigpiod_if HINTS ${CMAKE_SYSROOT}/usr/lib ${CMAKE_SYSROOT}/usr/local/lib) find_library(pigpiod_if2_LIBRARY NAMES pigpiod_if2 HINTS ${CMAKE_SYSROOT}/usr/lib ${CMAKE_SYSROOT}/usr/local/lib) set(pigpio_INCLUDE_DIRS ${pigpio_INCLUDE_DIR}) set(pigpio_INCLUDES ${pigpio_INCLUDE_DIR}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(pigpio DEFAULT_MSG pigpio_INCLUDE_DIR pigpio_LIBRARY pigpiod_if_LIBRARY pigpiod_if2_LIBRARY)
2. 重构CMakeLists.txt,移除本地硬编码路径
改用pkg-config(Yocto生态更推荐的依赖查找方式),或者确保CMake能从sysroot的标准模块路径找到Findpigpio.cmake:
cmake_minimum_required(VERSION 3.5) project(blinker) set(CMAKE_BUILD_TYPE RelWithDebInfo) # 优先使用pkg-config查找pigpio,自动适配Yocto sysroot find_package(PkgConfig REQUIRED) pkg_check_modules(pigpio REQUIRED IMPORTED_TARGET pigpio) add_executable(blinker main.c) # 链接pigpio依赖 target_link_libraries(blinker PRIVATE PkgConfig::pigpio)
3. 配置Yocto Recipe依赖
确保你的blinker_1.0.bb中添加pigpio依赖,让bitbake先构建并安装pigpio到sysroot:
DEPENDS = "pigpio" SRC_URI = "file://CMakeLists.txt \ file://main.c \ " inherit cmake
同时需要确保你有可用的pigpio Yocto Recipe(可自行编写或从开源层获取),该Recipe需完成以下操作:
- 将pigpio头文件安装到
${D}${includedir} - 将库文件安装到
${D}${libdir} - 若使用自定义
Findpigpio.cmake,需将其安装到${D}${datadir}/cmake/Modules,让CMake能自动找到
内容的提问来源于stack exchange,提问作者Schwafi
相关产品推荐
相关产品推荐

