无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模块。
解决步骤:
确认.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让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)
- 运行CMake时设置环境变量:
二、修复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
相关产品推荐
相关产品推荐

