«Фатальная ошибка: 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 не знаю, как проверить. пожалуйста, скажите мне, как я могу проверить
Усама
проверить, /usr/include/gtk-2.0существует ли каталог
Xylo
1
@Baraiam Я добавил контент main.c
Усама

Ответы:

23

Это означает, что у вас нет заголовков gtk для сборки вещей с использованием GTK +. Действительно странно, что ошибка не появилась на шаге ./configure. Чтобы решить эту проблему, просто сделайте:

sudo apt-get install libgtk2.0-dev

или libgtk-3-dev.

Это должно сделать это.

Braiam
источник
я скомпилировал несколько кодов, используя библиотеку #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чтобы сэкономить много времени

Alrick
источник
По крайней мере, в моем случае мне не нужно было выполнять 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

ThorSummoner
источник
Точно работает на Debian Buster. После установки этой библиотеки ниже команда может скомпилировать простой исходный код в исполняемый файл ./helloworld. gcc `pkg-config --cflags gtk+-3.0` -o helloworld helloworld.c `pkg-config --libs gtk+-3.0`
EsmaeelE
2

Поскольку вы используете autotools для генерации ваших Makefile-ов, вам нужно указать automake, как найти заголовки и библиотечные зависимости вашего проекта и включить их в окончательные Make-файлы. Это не моя область знаний, но я постараюсь указать вам правильное направление. Большая часть следующего основана на учебном пособии Использование библиотек C / C ++ с Automake и Autoconf.

Сначала необходимо изменить файл configure.ac верхнего уровня, чтобы добавить зависимость Gtk-2.0. Вы можете использовать PKG_CHECK_MODULESмакрос для запуска, pkg-configчтобы найти соответствующие директивы include и library - это хорошая практика, чтобы pkg-configсначала проверить, что существует, поэтому мы также должны добавить PKG_PROG_PKG_CONFIGтест. Части, выделенные полужирным шрифтом, указывают на то, что было добавлено относительно файлов в исходном учебнике amhello, с которого вы начали.

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библиотек и библиотеками.

steeldriver
источник
ты гений. Я просто ждал вашего ответа, потому что знал, что вы можете дать соответствующий ответ. спасибо :)
Усама