【问题标题】:Cannot find gtk/gtk.h when building nativefiledialog on Fedora 37在 Fedora 37 上构建 nativefiledialog 时找不到 gtk/gtk.h
【发布时间】:2023-01-07 03:41:57
【问题描述】:

我在我的 C++ 项目中使用 nativefiledialog-cmake 作为子模块。当我使用 CMake 生成构建文件时,它无法正确生成,因为它找不到 nativefiledialog 的源文件之一所需的 gtk/gtk.h 文件:nfd_gtk.c


我已经安装了以下 GTK 和 GTK 依赖包:

gtk2
gtk3
gtk4
gtk2-devel
gtk3-devel
gtk4-devel
gtk4-devel-tools

glib
glib-devel
gdk-pixbuf2-devel
atk
atk-devel
gobject-introspection
gobject-introspection-devel
libepoxy
libepoxy-devel

ls /usr/include | grep gtk返回

gtk-2.0
gtk-3.0
gtk-4.0
gtk-unix-print-2.0

GTK 标头位于这些文件夹中。


这是 nativefiledialog-cmake 的 CMakeLists.txt 文件:

include(CheckIncludeFile)
set(SOURCES src/nfd_common.c)

macro(REQUIRE_INCLUDE_FILE path name)
    CHECK_INCLUDE_FILE(${path} ${name})
    if (NOT ${name})
        message(FATAL_ERROR "${path} not found")
    endif ()
endmacro()
    
# add specific implementations
if (WIN32)
    REQUIRE_INCLUDE_FILE(windows.h HAS_WINDOWS)
    list(APPEND SOURCES src/nfd_win.cpp)
elseif (APPLE)
    REQUIRE_INCLUDE_FILE(AppKit/AppKit.h HAS_APPKIT)
    list(APPEND SOURCES src/nfd_cocoa.m)
elseif (UNIX)
    REQUIRE_INCLUDE_FILE(gtk/gtk.h HAS_GTK)
    list(APPEND SOURCES src/nfd_gtk.c)
elseif (UNIX)
    message(FATAL_ERROR "Cannot detect your system, please report to https://github.com/aarcangeli/nativefiledialog-cmake/issues")
endif ()

add_library(nativefiledialog ${SOURCES})
target_include_directories(nativefiledialog PUBLIC src/include)

我尝试添加此行(从pkg-config --cflags gtk+-3.0 返回)来告诉编译器 GTK 标头所在的位置,但无济于事:

set(FLAGS "${FLAGS} -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/sysprof-4 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/fribidi -I/usr/include/libxml2 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/gio-unix-2.0 -I/usr/include/cloudproviders -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/dbus-1.0 -I/usr/lib64/dbus-1.0/include -I/usr/include/at-spi-2.0 -pthread")

如何让 CMake 正确生成?

【问题讨论】:

  • 您能否阅读 linux 标签的标签维基?我猜它不适合在这里使用。请对您使用的所有标签执行相同的操作。

标签: linux cmake gtk gtk3 fedora


【解决方案1】:

首先,我不太确定你是如何到达set(FLAGS "${FLAGS} ...")行的,因为除非你指定了一些额外的逻辑,否则它只会创建一个变量FLAGS,它不是标准的CMake变量IIRC。

也许您打算使用的是target_compile_options(),您可以在其中为给定目标指定其他编译选项,在您的情况下很可能是nativefiledialog。这可能会解决您的问题,即:

target_compile_options(nativefiledialog PUBLIC "$<$<CONFIG:DEBUG>:${DEBUG_FLAGS}>")
target_compile_options(nativefiledialog PUBLIC "$<$<CONFIG:RELEASE>:${RELEASE_FLAGS}>")

或者在你的情况下:

target_compile_options(nativefiledialog PUBLIC "${FLAGS}")

然而,这不是好的做法,我建议重写nativefiledialogCMakeLists.txt

请记住,这绝不是你的错,nativefiledialog 有一个非常糟糕的CMakeLists.txt,因为作者没有使用任何预构建 CMake 功能,如 find_package(GTK)

【讨论】:

    猜你喜欢
    • 2022-12-04
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2011-07-13
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    相关资源
    最近更新 更多