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

无SUSE管理员权限下CMake查找gtkmm/atkmm库失败求助

解决CMake查找atkmm与gtkmm的问题

一、修复atkmm查找失败问题

你用pkg_check_modules查找atkmm失败,核心原因是系统pkg-config无法找到自定义路径下的atkmm-1.6.pc配置文件,你手动写的Findatkmm.cmake对pkg_check_modules无效——该命令依赖pkg-config的.pc文件,而非CMake的Find模块。

解决步骤:

  1. 确认.pc文件位置
    检查atkmm预编译包或源码构建后的产物,找到atkmm-1.6.pc文件,通常位于${HOME}/opt/atkmm/usr/lib64/pkgconfig/或${HOME}/opt/atkmm/usr/share/pkgconfig/目录下。如果是从RPM提取的包没有该文件,需要手动创建一个示例.pc文件放在上述pkgconfig目录中:

    prefix=${HOME}/opt/atkmm/usr
    exec_prefix=${prefix}
    libdir=${exec_prefix}/lib64
    includedir=${prefix}/include/atkmm-1.6
    
    name: atkmm
    description: C++ bindings for ATK
    version: 2.24.2
    requires: atk >= 2.24.0 glibmm-2.4 >= 2.48.0
    libs: -L${libdir} -latkmm-1.6
    cflags: -I${includedir} -I${prefix}/include/glibmm-2.4 -I${prefix}/lib64/glibmm-2.4/include
    
  2. 让pkg-config识别自定义路径
    有两种方式告知pkg-config去自定义路径查找.pc文件:

    • 运行CMake时设置环境变量:
      PKG_CONFIG_PATH=${HOME}/opt/atkmm/usr/lib64/pkgconfig:${HOME}/opt/atkmm/usr/share/pkgconfig:$PKG_CONFIG_PATH cmake ..
      
    • 在CMake脚本中提前配置:
      set(ENV{PKG_CONFIG_PATH} "${HOME}/opt/atkmm/usr/lib64/pkgconfig:${HOME}/opt/atkmm/usr/share/pkgconfig:$ENV{PKG_CONFIG_PATH}")
      pkg_check_modules(atkmm REQUIRED IMPORTED_TARGET atkmm-1.6>=2.24.2)
      

二、修复GTK2模块中gtkmm查找失败问题

CMake自带的FindGTK2.cmake默认仅在系统路径查找依赖,无法识别你自定义路径下的gtkmm及其依赖(gdkmm、glibmm等),可通过以下两种方式解决:

方式1:手动指定GTK2相关变量

在调用find_package前,直接设置CMake所需的路径变量:

# 替换为你的实际安装路径
set(GTK2_GTKMM_INCLUDE_DIR ${HOME}/opt/gtkmm/usr/include/gtkmm-2.4)
set(GTK2_GTKMMCONFIG_INCLUDE_DIR ${HOME}/opt/gtkmm/usr/lib64/gtkmm-2.4/include)
set(GTK2_GDKMM_INCLUDE_DIR ${HOME}/opt/gtkmm/usr/include/gdkmm-2.4)
set(GTK2_GDKMMCONFIG_INCLUDE_DIR ${HOME}/opt/gtkmm/usr/lib64/gdkmm-2.4/include)
set(GTK2_GLIBMM_INCLUDE_DIR ${HOME}/opt/glibmm/usr/include/glibmm-2.4)
set(GTK2_GLIBMMCONFIG_INCLUDE_DIR ${HOME}/opt/glibmm/usr/lib64/glibmm-2.4/include)
set(GTK2_GTKMM_LIBRARY ${HOME}/opt/gtkmm/usr/lib64/libgtkmm-2.4.so)
set(GTK2_GDKMM_LIBRARY ${HOME}/opt/gtkmm/usr/lib64/libgdkmm-2.4.so)
set(GTK2_GLIBMM_LIBRARY ${HOME}/opt/glibmm/usr/lib64/libglibmm-2.4.so)

find_package(GTK2 2.4 REQUIRED gtk gtkmm)

也可以在运行CMake时通过命令行参数传递这些变量:

cmake .. \
  -DGTK2_GTKMM_INCLUDE_DIR=${HOME}/opt/gtkmm/usr/include/gtkmm-2.4 \
  -DGTK2_GTKMMCONFIG_INCLUDE_DIR=${HOME}/opt/gtkmm/usr/lib64/gtkmm-2.4/include \
  -DGTK2_GDKMM_INCLUDE_DIR=${HOME}/opt/gtkmm/usr/include/gdkmm-2.4 \
  -DGTK2_GDKMMCONFIG_INCLUDE_DIR=${HOME}/opt/gtkmm/usr/lib64/gdkmm-2.4/include \
  -DGTK2_GLIBMM_INCLUDE_DIR=${HOME}/opt/glibmm/usr/include/glibmm-2.4 \
  -DGTK2_GLIBMMCONFIG_INCLUDE_DIR=${HOME}/opt/glibmm/usr/lib64/glibmm-2.4/include \
  -DGTK2_GTKMM_LIBRARY=${HOME}/opt/gtkmm/usr/lib64/libgtkmm-2.4.so \
  -DGTK2_GDKMM_LIBRARY=${HOME}/opt/gtkmm/usr/lib64/libgdkmm-2.4.so \
  -DGTK2_GLIBMM_LIBRARY=${HOME}/opt/glibmm/usr/lib64/libglibmm-2.4.so

方式2:改用pkg-config统一查找gtkmm

放弃CMake自带的FindGTK2.cmake,用pkg_check_modules统一查找gtkmm及其依赖,适配自定义路径更灵活:

# 设置pkg-config路径,包含gtkmm及依赖的.pc文件目录
set(ENV{PKG_CONFIG_PATH} "${HOME}/opt/gtkmm/usr/lib64/pkgconfig:${HOME}/opt/glibmm/usr/lib64/pkgconfig:$ENV{PKG_CONFIG_PATH}")
pkg_check_modules(GTKMM REQUIRED IMPORTED_TARGET gtkmm-2.4>=2.24.0)
pkg_check_modules(GDKMM REQUIRED IMPORTED_TARGET gdkmm-2.4>=2.24.0)
pkg_check_modules(GLIBMM REQUIRED IMPORTED_TARGET glibmm-2.4>=2.48.0)

# 链接时使用PkgConfig提供的目标
target_link_libraries(你的目标名称 PRIVATE PkgConfig::GTKMM PkgConfig::atkmm)

通用注意事项

  • 确保所有依赖库(如atkmm依赖的glibmm、atk,gtkmm依赖的gdkmm、gtk+等)都已正确安装在自定义路径,且它们的.pc文件或路径也已配置到pkg-config或CMake中。
  • 编译后运行程序前,可将自定义库的lib目录加入LD_LIBRARY_PATH,避免运行时找不到库:
    export LD_LIBRARY_PATH=${HOME}/opt/atkmm/usr/lib64:${HOME}/opt/gtkmm/usr/lib64:$LD_LIBRARY_PATH
    
  • 从RPM提取包时,要确认提取完整的头文件、.so库文件、.pc配置文件,缺少任何一种都可能导致查找失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:07:26