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

Yocto编译Recipe遇CMake find_package错误,单独运行CMake正常

解决Yocto Project构建pigpio程序时CMake找不到库的问题

问题根源

本地CMake编译正常,但Yocto交叉编译失败,核心原因有三点:

  1. 路径硬编码不匹配:你提供的Findpigpio.cmake固定搜索/usr/local路径,但Yocto交叉编译时,所有依赖文件都存放在recipe-sysroot目录下,而非主机系统的/usr/local。
  2. 本地相对路径无效:CMakeLists.txt中用${PROJECT_SOURCE_DIR}指定的pigpio路径是本地开发路径,Yocto构建时工作目录切换到tmp/work下,该路径完全无效。
  3. 未利用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:05:22