„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);
}

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ć.


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


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


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], [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

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.


jesteś geniuszem. właśnie czekałem na twoją odpowiedź, ponieważ wiedziałem, że możesz udzielić właściwej odpowiedzi. dzięki :)
— osama,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.