【问题标题】:What is the recommended way of using GLib2 with CMake将 GLib2 与 CMake 一起使用的推荐方法是什么
【发布时间】:2016-04-26 14:38:10
【问题描述】:

我喜欢在我的 C 应用程序中使用 GLib,它使用 CMake 作为构建系统。

现在,我不知如何在我的 CMakeLists.txt 中启用 GLib。基本上,您使用find_package 命令在cmake 中添加库,所以我尝试了,根据this bugreport

find_package(GLib2)

但是什么也没找到。另一方面,在 GLib 文档中建议使用 pkg-config

在基于 cmake 的项目中启用 glib 的推荐方法是什么?

【问题讨论】:

  • 如果 glib 已安装(通常是这样),则 gcc 将使用它,除非指示不要(带有编译器标志)。
  • 但是这个例子没有编译:paste.ubuntu.com/16064301 因为glib.h 没有找到
  • 但我不清楚是否应该使用 OP 采用的 pkg-config 方法,或者是否应该将 FindGLib.cmake 复制到我的根目录。这个版本知道吗?
  • 使用 cmake 时,我会跳过 pkg-config 并编写自己的包模块。 Glib 看起来很基础,我希望一个模块会预装 cmake

标签: cmake glib


【解决方案1】:

自 CMake 3.6(2016 年 7 月发布)以来,pkg_check_modules 支持 IMPORTED_TARGET 参数,将依赖配置减少到单个 target_link_libraries 语句,它将处理所有必需的编译器和链接器选项:

find_package(PkgConfig REQUIRED)
pkg_check_modules(deps REQUIRED IMPORTED_TARGET glib-2.0)
target_link_libraries(target PkgConfig::deps)

(上面我使用了名称deps,因为可以使用单个pkg_check_modules 语句列出多个依赖项)

【讨论】:

  • 更正:IMPORTED_TARGET 出现在 CMake 3.6 中,正如您注意到 3.5 文档仍然没有提及它(实际上它不起作用,使用 CMake 3.5.2 测试): cmake.org/cmake/help/v3.5/module/FindPkgConfig.html
  • 对,CMake 3.6(2016年7月发布)
【解决方案2】:

在您的 CMakeLists.txt 中:

find_package(PkgConfig REQUIRED)
pkg_search_module(GLIB REQUIRED glib-2.0)
target_include_directories(mytarget PRIVATE ${GLIB_INCLUDE_DIRS})
target_link_libraries(mytarget INTERFACE ${GLIB_LDFLAGS})

【讨论】:

  • 为什么要使用INTERFACE 关键字?这不会根据docs 将 glib 链接到目标。
  • OP 声明他正在链接一个应用程序,该应用程序通常是一个动态链接的目标。由于 GLib 是一个系统库,因此使用 INTERFACE 而不是 PUBLIC 可以避免在构建时链接到 Llib 的可能静态版本,而是将其写入动态依赖项并将其推迟到动态链接器。但是,其中一些行为取决于构建时的系统配置。
【解决方案3】:

看看我在using CMake with GTK上的回答

与 GLib 几乎相同。

【讨论】:

    【解决方案4】:

    GLib(以及其他各种使用自动工具的 C 库)提供了一个 pkg-config 文件用于声明:

    • 编译器标志
    • 链接器标志
    • 构建时变量
    • 依赖关系

    发现这些库在 CMake 中的位置的适当方法是使用 FindPkgConfig CMake 模块:

    https://cmake.org/cmake/help/v3.0/module/FindPkgConfig.html

    【讨论】:

      【解决方案5】:

      又一个版本,多个答案的组合以及对我真正有用的东西(在 Linux 上)!

      cmake_minimum_required(VERSION 2.6.4)
      project(my_proj)
      
      find_package(PkgConfig REQUIRED)
      pkg_search_module(GLIB REQUIRED glib-2.0)
      
      include_directories(${GLIB_INCLUDE_DIRS})
      link_directories(${GLIB_LIBRARY_DIRS})
      
      add_executable(my_proj main.c)
      
      add_definitions(${GLIB_CFLAGS_OTHER})
      target_link_libraries(my_proj ${GLIB_LIBRARIES})
      

      【讨论】:

        【解决方案6】:

        我一直在研究一些您可能想尝试的CMake modules for GNOME(包括one for GLib)。基本上只要find_package(GLib),然后你可以使用glib-2.0导入的目标链接到它。

        【讨论】:

        • 感谢您提供 MIT 许可证。我能找到的唯一一个是 GPL2.0。
        猜你喜欢
        • 2014-11-05
        • 1970-01-01
        • 1970-01-01
        • 2019-04-11
        • 2013-01-11
        • 2021-08-15
        • 2014-12-11
        • 2019-09-15
        • 1970-01-01
        相关资源
        最近更新 更多