交叉编译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
相关产品推荐
相关产品推荐

