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

交叉编译BeagleBone Black应用:CMake调用PkgConfig识别GTKMM问题

交叉编译BeagleBone Black GTKMM应用时CMake+PkgConfig的配置问题

我正在为BeagleBone Black交叉编译一款GTKMM应用:

  • 已在板上直接编译成功(注释CMakeLists里的交叉编译配置)
  • 已完成基础hello程序的交叉编译(基于BeagleBone交叉编译教程)

现在需要让CMake结合PkgConfig正确调用目标系统的GTKMM库,但当前配置存在问题:

现有CMakeLists.txt配置

cmake_minimum_required(VERSION 3.13)

#  ~~~~~~~~~~~ 交叉编译配置段(BeagleBone板上编译时需注释)~~~~

set(CMAKE_TOOLCHAIN_FILE "BBBToolchain.cmake")

set(CMAKE_SYSROOT "/home/cole/beaglebone/cross-compiler-toolchain/linaro-toolchain/rootfs")
set(ENV{PKG_CONFIG_DIR} "/home/cole/beaglebone/cross-compiler-toolchain/linaro-toolchain/rootfs/usr/bin")
set(ENV{PKG_CONFIG_LIBDIR} "${CMAKE_SYSROOT}/usr/lib/pkgconfig:${CMAKE_SYSROOT}/usr/share/pkgconfig")
set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT})

# ~~~~ 交叉编译配置段结束

project(question-manager CXX)

find_package(PkgConfig REQUIRED)
pkg_check_modules(GTKMM REQUIRED gtkmm-3.0)

add_executable(EMBEDDED-GUI src/view/embedded-app/opengtk-version/start-gui.cpp
                            src/view/embedded-app/opengtk-version/main-window.cpp
                            src/view/embedded-app/opengtk-version/question-card.cpp)

target_link_libraries(EMBEDDED-GUI PUBLIC ${GTKMM_LIBRARIES})
target_include_directories(EMBEDDED-GUI PUBLIC ${GTKMM_INCLUDE_DIRS})
target_link_directories(EMBEDDED-GUI PUBLIC ${GTKMM_LIBRARY_DIRS})
target_compile_options(EMBEDDED-GUI PUBLIC ${GTKMM_CFLAGS_OTHER})

错误情况

执行CMake配置时,始终调用主机的pkg-config(版本0.29.2,目标系统为0.29),报错找不到gtkmm-3.0:

$ cmake ..
-- Beagle Bone Black sysroot: /home/scshafe/beaglebone/cross-compiler-toolchain/linaro-toolchain/rootfs
-- No CROSS_COMPILE environmental variable set, using default ARM linux cross compiler name arm-linux-gnueabihf
-- Using sysroot path: /home/scshafe/beaglebone/cross-compiler-toolchain/linaro-toolchain/rootfs
-- Beagle Bone Black sysroot: /home/scshafe/beaglebone/cross-compiler-toolchain/linaro-toolchain/rootfs
-- No CROSS_COMPILE environmental variable set, using default ARM linux cross compiler name arm-linux-gnueabihf
-- Using sysroot path: /home/scshafe/beaglebone/cross-compiler-toolchain/linaro-toolchain/rootfs
-- The CXX compiler identification is GNU 7.5.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /home/scshafe/beaglebone/cross-compiler-toolchain/linaro-toolchain/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.2") 
-- Checking for module 'gtkmm-3.0'
--   No package 'gtkmm-3.0' found
CMake Error at /usr/share/cmake-3.22/Modules/FindPkgConfig.cmake:603 (message):
  A required package was not found
Call Stack (most recent call first):
  /usr/share/cmake-3.22/Modules/FindPkgConfig.cmake:825 (_pkg_check_modules_internal)
  CMakeLists.txt:48 (pkg_check_modules)


-- Configuring incomplete, errors occurred!
See also "/home/scshafe/git-projects/question-list-manager/build/CMakeFiles/CMakeOutput.log".

如果添加以下配置:

set(ENV{PKG_CONFIG_PATH} "/home/scshafe/beaglebone/cross-compiler-toolchain/linaro-toolchain/rootfs/usr/lib/arm-linux-gnueabihf/pkgconfig")

PkgConfig能找到gtkmm-3.0,但仍用主机的pkg-config版本,最终编译出现链接错误。


解决方案

1. 转移环境变量配置到Toolchain文件

不要在CMakeLists.txt中直接设置PKG_CONFIG相关环境变量,而是将配置迁移到BBBToolchain.cmake中,确保在find_package(PkgConfig)之前生效:

# 在BBBToolchain.cmake中添加
set(CMAKE_SYSROOT "/home/scshafe/beaglebone/cross-compiler-toolchain/linaro-toolchain/rootfs")

# 重置PKG_CONFIG变量,避免主机路径干扰
set(ENV{PKG_CONFIG_DIR} "")
set(ENV{PKG_CONFIG_LIBDIR} "${CMAKE_SYSROOT}/usr/lib/pkgconfig:${CMAKE_SYSROOT}/usr/share/pkgconfig:${CMAKE_SYSROOT}/usr/lib/arm-linux-gnueabihf/pkgconfig")
set(ENV{PKG_CONFIG_SYSROOT_DIR} "${CMAKE_SYSROOT}")

2. 配置CMake的根路径查找规则

在BBBToolchain.cmake中添加以下规则,强制CMake仅在sysroot下查找库、头文件和包:

set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

3. 验证目标系统的.pc文件

检查sysroot下usr/lib/arm-linux-gnueabihf/pkgconfig/gtkmm-3.0.pc文件:

  • 确保prefix、exec_prefix等变量使用目标系统的相对路径,而非绝对路径
  • 确认依赖的gtk+-3.0、glibmm等库的.pc文件也存在于sysroot的pkgconfig搜索路径中

4. 优先使用PKG_CONFIG_LIBDIR而非PKG_CONFIG_PATH

避免直接设置PKG_CONFIG_PATH,它会覆盖默认搜索路径;PKG_CONFIG_LIBDIR是添加搜索路径,更适配交叉编译场景,能同时保留目标系统的默认pkgconfig路径。


内容的提问来源于stack exchange,提问作者shafe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:55:54