„Błąd krytyczny: gtk / gtk.h: brak takiego pliku lub katalogu” przy użyciu make

18

Próbuję użyć komendy make do zbudowania. Śledzę to . Kompiluję kod w języku GTK + 2 i 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

to jest kod 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);
}
osama
źródło
czy nawet sprawdziłeś, czy plik jest tam, jak mówi? /gtk/gtk.h
Xylo
@Xylo nie wiem jak to sprawdzić. proszę powiedz mi, jak mogę to sprawdzić
osama
sprawdź, czy katalog /usr/include/gtk-2.0istnieje
Xylo
1
@Baraiam I dodałem zawartość main.c
osama

Odpowiedzi:

23

Oznacza to, że nie masz nagłówków gtk do tworzenia rzeczy za pomocą GTK +. To naprawdę dziwne, że błąd nie pojawił się w kroku ./configure. Aby rozwiązać ten problem, po prostu wykonaj:

sudo apt-get install libgtk2.0-dev

lub libgtk-3-dev.

Że należy to zrobić.

Braiam
źródło
skompilowałem kilka kodów przy użyciu biblioteki #include <gtk / gtk.h>
osama
problem polega na tym, że próbuję użyć polecenia make
osama
czy możesz dodać odpowiedni kod, aby sprawdzić, czy można go odtworzyć?
Braiam
moje kompilacje doskonale, kiedy kompiluję, używając tego polecenia gcc main.c -o hellogtk-config --cflags --libs gtk+-2.0
osama
przejdź do tego linku, a zrozumiesz, co próbuję zrobić askubuntu.com/questions/397246/…
osama
9
sudo apt-get install build-essential gnome-devel

Jest to również potrzebne, abyś mógł robić fajne rzeczy, takie jak:

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

Pozwala pkg-configzaoszczędzić dużo czasu

Alrick
źródło
Przynajmniej w moim przypadku nie musiałem wykonywać sudo apt-get install build-essential gnome-devel, a drugie polecenie wydawało się początkowo działać, ale doprowadziło również do problemów glib „Brak takich plików lub katalogów”. Rozwiązanie było bardziej jak:g++ `pkg-config --cflags gtk+-3.0` main.cpp -o base `pkg-config --libs gtk+-3.0`
Rui Pimentel
3

Odpowiednikiem pakietu debian / ubuntu dla Gtk3 jest libgtk-3-dev

ThorSummoner
źródło
Dokładnie działa na Buster Debiana. Po zainstalowaniu tej biblioteki poniżej polecenie może skompilować prosty kod źródłowy do pliku wykonywalnego ./helloworld. gcc `pkg-config --cflags gtk+-3.0` -o helloworld helloworld.c `pkg-config --libs gtk+-3.0`
EsmaeelE
2

Ponieważ używasz autotools do generowania plików Makefiles, musisz powiedzieć automake, jak znaleźć zależności między nagłówkiem i biblioteką twojego projektu i włączyć je do końcowych plików Makefiles. To nie jest moja specjalizacja, ale postaram się skierować cię w dobrym kierunku. Większość poniższych instrukcji oparta jest na samouczku opisanym w temacie Korzystanie z bibliotek C / C ++ w programach Automake i Autoconf

Najpierw musisz zmodyfikować plik config.ac najwyższego poziomu, aby dodać zależność Gtk-2.0. Możesz użyć PKG_CHECK_MODULESmakra do uruchomienia, pkg-configaby znaleźć odpowiednie dyrektywy włączające i dyrektywy biblioteczne - dobrą praktyką jest sprawdzenie, czy pkg-configistnieje ona pierwsza, dlatego też powinniśmy dodać PKG_PROG_PKG_CONFIGtest. Pogrubione fragmenty wskazują, co zostało dodane, w stosunku do plików w oryginalnym tutorialu amhello, od którego zacząłeś.

AC_INIT([amhello], [1.0], [[email protected]])
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

Następnie src/Makefile.ammożesz pobrać CFLAGS i LIBS, korzystając z GTKidentyfikatora użytego w PKG_CHECK_MODULESpowyższym makrze

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

Po ponownym uruchomieniu makepowinien ponownie wygenerować plik src / Makefile z odpowiednimi -Iścieżkami dołączania, ścieżkami -Lbibliotek i bibliotek.

steeldriver
źródło
jesteś geniuszem. właśnie czekałem na twoją odpowiedź, ponieważ wiedziałem, że możesz udzielić właściwej odpowiedzi. dzięki :)
osama,