致命错误:gtk/gtk.h:没有该文件或目录

我正在尝试使用make命令进行构建。我正在按照this的指示进行操作。我正在使用GTK+2和C语言编译代码。
hp@ubuntu:~/amhello$ make
make  all-recursive
make[1]: Entering directory `/home/hp/amhello'
Making all in src
make[2]: Entering directory `/home/hp/amhello/src'
gcc -DHAVE_CONFIG_H -I. -I..     -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o         main.o main.c
main.c:3:20: fatal error: gtk/gtk.h: No such file or directory
compilation terminated.
make[2]: *** [main.o] Error 1
make[2]: Leaving directory `/home/hp/amhello/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/hp/amhello'
make: *** [all] Error 2

这是主要的main.c代码。
#include<config.h>
#include<stdio.h>
#include<gtk/gtk.h>
void static call(GtkWidget *widget,gpointer data) {
    g_print("%s \n",(gchar*) data);
}
int main(int agrc, char *agrv[]) {
    gtk_init(&agrc,&agrv);
    GtkWidget *window,*button;
    window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(window,"delete-event",G_CALLBACK(gtk_main_quit),NULL);
    gtk_window_set_title(GTK_WINDOW(window),"one button");
    button=gtk_button_new_with_label("hello world");
    g_signal_connect(button,"clicked",G_CALLBACK(call),(gpointer) "hello world");
    gtk_container_set_border_width(GTK_CONTAINER(window),10);
    gtk_container_add(GTK_CONTAINER(window),button);
    gtk_widget_show_all(window);
    gtk_main();
    return (0);
}

你有没有检查文件是否存在,就像它所说的那样?/gtk/gtk.h - Xylo
@Xylo不知道如何检查,请告诉我如何进行检查。 - osama
检查目录/usr/include/gtk-2.0是否存在。 - Xylo
1@Baraiam 我已经添加了main.c的内容。 - osama
5个回答

这意味着您没有用于使用GTK+构建东西的gtk标头。真的很奇怪,错误在./configure步骤中没有显示出来。要解决此问题,请执行以下操作:
sudo apt-get install libgtk2.0-dev

或者 libgtk-3-dev
应该就这样了。

我使用#include<gtk/gtk.h>库编写了几个代码。 - osama
问题是,当我尝试使用命令"make"时。 - osama
你能添加相关的代码,然后看看是否可以复现吗? - Braiam
当我使用以下命令编译时,我的代码完美编译: gcc main.c -o hello gtk-config --cflags --libs gtk+-2.0 - osama
请访问此链接,您将了解我正在尝试做什么 http://askubuntu.com/questions/397246/makefile448-missing-separator-stop-error - osama

sudo apt-get install build-essential gnome-devel

这也是必需的,这样你就可以做一些很酷的事情,比如:
g++ main.cpp -o base `pkg-config --cflags --libs gtk+-3.0`

它允许你使用pkg-config来节省大量时间。

至少在我的情况下,我不需要执行 sudo apt-get install build-essential gnome-devel,第二个命令似乎一开始可以工作,但也导致了 glib "No such file or directory" 问题。解决方案更像是:g++ \pkg-config --cflags gtk+-3.0` main.cpp -o base `pkg-config --libs gtk+-3.0`` - Rui Pimentel

Gtk3在Debian/Ubuntu中的等效软件包是libgtk-3-dev

在Debian Buster上完全可用。安装了这个库之后,下面的命令可以将简单的源代码编译成./helloworld可执行文件。 gcc \pkg-config --cflags gtk+-3.0` -o helloworld helloworld.c `pkg-config --libs gtk+-3.0`` - EsmaeelE

在CentOS 7中: a) 软件包:
pkg-config --list-all|grep gtk
...
gtk+-3.0                  GTK+ - GTK+ Graphical UI Library
...
gtk+-2.0                  GTK+ - GTK+ Graphical UI Library (x11 target)
...

编辑代码片段的标题部分:
#include<config.h>
#include<stdio.h>
#include<gtk/gtk.h>

#include<stdlib.h>
#include<stdio.h>
#include<gtk/gtk.h>

c) 使用以下方式进行编译:

gcc main.c -o main `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0` 

或者
gcc main.c -o main `pkg-config --cflags gtk+-3.0` `pkg-config --libs gtk+-3.0` 

d) 使用以下方式执行:

GDK_SCALE=5 ./main

对我有效!


由于您正在使用autotools生成Makefile,您需要告诉automake如何找到项目的头文件和库依赖,并将它们合并到最终的Makefile中。这不是我的专业领域,但我会尽力指导您正确的方向。以下大部分内容基于在使用Automake和Autoconf与C/C++库教程中找到的内容。
首先,您必须修改顶层的configure.ac文件以添加对Gtk-2.0的依赖。您可以使用PKG_CHECK_MODULES宏来运行pkg-config命令,以查找相应的包含和库指令 - 最好先检查pkg-config是否存在,因此我们还应该添加一个PKG_PROG_PKG_CONFIG测试。粗体部分表示相对于您从原始amhello教程开始的文件所添加的内容。

AC_INIT([amhello], [1.0], [bug-automake@gnu.org])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
 Makefile
 src/Makefile
])
dnl Test for pkg-config
PKG_PROG_PKG_CONFIG([0.22])
dnl Test for gtk+
PKG_CHECK_MODULES([GTK], [gtk+-2.0 >= 2.24.10])
AC_OUTPUT

然后在您的src/Makefile.am中,您可以使用上面在PKG_CHECK_MODULES宏中使用的GTK标识符来检索CFLAGS和LIBS。

bin_PROGRAMS = hello
hello_SOURCES = main.c
AM_CPPFLAGS = ${GTK_CFLAGS}
hello_LDADD = ${GTK_LIBS}

当你重新运行make时,它应该使用适当的-I包含路径、-L库路径和库重新生成你的src/Makefile。

你真是个天才。我只是在等待你的回答,因为我知道你能给出恰当的答案。谢谢 :) - osama