29

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);
}
4
  • did you even check if the file is there as it states? /gtk/gtk.h
    – Xylo
    Dec 29, 2013 at 23:10
  • @Xylo dont know how to check. please tell me how i can check
    – osama
    Dec 29, 2013 at 23:11
  • check if directory /usr/include/gtk-2.0 exists
    – Xylo
    Dec 29, 2013 at 23:18
  • 1
    @Baraiam i have added the content of main.c
    – osama
    Dec 29, 2013 at 23:36

5 Answers 5

39

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.

5
  • i have compiled several codes using #include<gtk/gtk.h> library
    – osama
    Dec 29, 2013 at 23:20
  • the problem is when i am trying to use command make
    – osama
    Dec 29, 2013 at 23:22
  • can you add the relevant code then to see if is possible to reproduce?
    – Braiam
    Dec 29, 2013 at 23:23
  • my compilies perfectly when i compile it by using this command gcc main.c -o hello gtk-config --cflags --libs gtk+-2.0
    – osama
    Dec 29, 2013 at 23:23
  • go to this link and you will understand what i am trying to do askubuntu.com/questions/397246/…
    – osama
    Dec 29, 2013 at 23:25
13
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

1
  • At least in my case, I did not have to execute sudo apt-get install build-essential gnome-devel, and the second command seemed to work at first, but led to glib "No such file or directory" problems as well. Solution was more like: g++ `pkg-config --cflags gtk+-3.0` main.cpp -o base `pkg-config --libs gtk+-3.0` Jan 19, 2016 at 13:54
3

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

1
  • Exactly works on debian buster. After install this library bellow command can compile simple source code to ./helloworld executable. gcc `pkg-config --cflags gtk+-3.0` -o helloworld helloworld.c `pkg-config --libs gtk+-3.0`
    – EsmaeelE
    Dec 18, 2019 at 2:57
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.

1
  • you are a genius. i was just waiting for your answer because i knew you can give the appropriate answer. thanks :)
    – osama
    Dec 30, 2013 at 2:14
1

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!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.