36

I am trying to use make command to build. I am following this. I am compiling a code using GTK+2 and C language

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

this is the main.c code

#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);
}
osama
  • 1,111

5 Answers5

50

This means that you don't have the gtk headers to build stuff using GTK+. Is really weird that the error didn't showed up at ./configure step. To solve this just do:

sudo apt-get install libgtk2.0-dev

or libgtk-3-dev.

That should do it.

Braiam
  • 69,112
15
sudo apt-get install build-essential gnome-devel

That is also needed so that you can do cool things like:

g++ main.cpp -o base `pkg-config --cflags --libs gtk+-3.0`

It allows you to use pkg-config to save a whole lot of time

Alrick
  • 151
3

In CentOS 7: a) packages:

pkg-config --list-all|grep gtk
...
gtk+-3.0                  GTK+ - GTK+ Graphical UI Library
...
gtk+-2.0                  GTK+ - GTK+ Graphical UI Library (x11 target)
...

b) editing header section of your snippet:

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

to

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

c) compiling using:

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

or

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

and

d) executing using:

GDK_SCALE=5 ./main

worked for me!

AVA
  • 131
  • 3
3

Gtk3 equivalent debian/ubuntu package is libgtk-3-dev

ThorSummoner
  • 3,372
2

Since you are using autotools to generate your Makefiles, you need to tell automake how to find the header and library dependencies of your project and incorporate them into the final Makefiles. This is not my area of expertise but I will try to point you in the right direction. Most of the following is based on the tutorial found at Using C/C++ libraries with Automake and Autoconf

First, you must modify the top level configure.ac file to add the Gtk-2.0 dependency. You can use the PKG_CHECK_MODULES macro to run pkg-config to find the corresponding include and library directives - it's good practice to check that pkg-config exists first, so we should add a PKG_PROG_PKG_CONFIG test as well. The bolded portions indicate what`s added, relative to the files in the original amhello tutorial that you started from.

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

Then in your src/Makefile.am you can retrieve the CFLAGS and LIBS using the GTK identifier that you used in the PKG_CHECK_MODULES macro above

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

When you re-run make, it should re-generate your src/Makefile with the appropriate -I include paths, -L library paths and libraries.

steeldriver
  • 142,475