"Фатальна помилка: gtk / gtk.h: Немає такого файлу чи каталогу" за допомогою make


18

Я намагаюся використовувати команду make для побудови. Я за цим стежу . Я складаю код за допомогою мови 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

Відповіді:


23

Це означає, що у вас немає заголовків gtk для створення матеріалів за допомогою GTK +. Дійсно дивно, що помилка не з’явилася на ./configure step. Щоб вирішити це, просто зробіть:

sudo apt-get install libgtk2.0-dev

або libgtk-3-dev.

Це повинно це робити.


я склав кілька кодів, використовуючи бібліотеку #include <gtk / gtk.h>
osama

проблема полягає в тому, що я намагаюся використовувати команду make
osama

чи можете ви додати відповідний код, щоб побачити, чи можливо відтворити?
Брайам

мій компілюється чудово, коли я компілюю його за допомогою цієї команди gcc main.c -o привітgtk-config --cflags --libs gtk+-2.0
osama

перейдіть за цим посиланням, і ви зрозумієте, що я намагаюся зробити askubuntu.com/questions/397246/…
osama

9
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, а друга команда, здається, спочатку спрацювала, але призвела до проблеми "Немає такого файлу чи каталогу". Рішення було більше схожим на:g++ `pkg-config --cflags gtk+-3.0` main.cpp -o base `pkg-config --libs gtk+-3.0`
Руй Піментел

3

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

2

Оскільки ви використовуєте autotools для генерування Makefiles, вам потрібно сказати автоматизовано, як знайти залежності заголовка та бібліотеки вашого проекту та включити їх у кінцеві Makefiles. Це не моя сфера знань, але я постараюся направити вас у правильному напрямку. Більшість із наведених нижче базується на підручнику, знайденому у використанні C / C ++ бібліотек з Automake та Autoconf

По-перше, ви повинні змінити файл configure.ac верхнього рівня, щоб додати залежність від Gtk-2.0. Ви можете використовувати PKG_CHECK_MODULESмакрос для запуску, pkg-configщоб знайти відповідні директиви щодо включення та бібліотеки - це найкраща практика перевірити, що pkg-configіснує спочатку, тому ми також повинні додати PKG_PROG_PKG_CONFIGтест. Жирні частини вказують, що додано, відносно файлів в оригінальному посібнику з амхелло, з якого ви розпочали роботу.

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ви можете отримати CFLAGS та LIBS за допомогою GTKідентифікатора, який ви використовували в PKG_CHECK_MODULESмакросі вище

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

Після повторного запуску makeвін повинен повторно генерувати ваш src / Makefile з відповідними -Iвключати шляхи, -Lшляхи до бібліотеки та бібліотеки.


ти геній. я просто чекав вашої відповіді, тому що я знав, що ви можете дати відповідну відповідь. дякую :)
osama
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.