“ ข้อผิดพลาดร้ายแรง: 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 + แปลกจริง ๆ ที่ข้อผิดพลาดไม่ปรากฏขึ้นที่ขั้นตอน. / config เพื่อแก้ปัญหานี้เพียงทำ:

sudo apt-get install libgtk2.0-dev

libgtk-3-devหรือ

ที่ควรทำ


ฉันได้รวบรวมหลายรหัสโดยใช้ #include <gtk / gtk.h> library
osama

ปัญหาคือเมื่อฉันพยายามใช้คำสั่ง make
osama

คุณสามารถเพิ่มรหัสที่เกี่ยวข้องแล้วเพื่อดูว่าเป็นไปได้ในการทำซ้ำ?
Braiam

คอมไพล์ของฉันอย่างสมบูรณ์แบบเมื่อฉันรวบรวมมันโดยใช้คำสั่งนี้ gcc main.c -o hellogtk-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และคำสั่งที่สองดูเหมือนจะทำงานในตอนแรก แต่นำไปสู่ ​​glib "ไม่มีปัญหาไฟล์หรือไดเรกทอรี" เช่นกัน วิธีแก้ปัญหาเป็นเช่น:g++ `pkg-config --cflags gtk+-3.0` main.cpp -o base `pkg-config --libs gtk+-3.0`
Rui Pimentel

3

Gtk3 เทียบเท่า debian / ubuntu package คือ libgtk-3-dev


ทำงานได้ดีบนมือปราบเดเบียน หลังจากติดตั้งคำสั่งร้องไลบรารีนี้สามารถรวบรวมซอร์สโค้ดแบบง่ายไปยัง. / helloWorld ปฏิบัติการ gcc `pkg-config --cflags gtk+-3.0` -o helloworld helloworld.c `pkg-config --libs gtk+-3.0`
EsmaeelE

2

เนื่องจากคุณใช้เครื่องมืออัตโนมัติในการสร้าง Makefiles ของคุณคุณต้องบอกวิธีการค้นหาส่วนหัวและไลบรารีที่พึ่งพาของโครงการของคุณโดยอัตโนมัติและรวมไว้ใน Makefiles ขั้นสุดท้าย นี่ไม่ใช่ความเชี่ยวชาญของฉัน แต่ฉันจะพยายามชี้คุณในทิศทางที่ถูกต้อง ส่วนใหญ่ต่อไปนี้เป็นไปตามบทเรียนที่พบในการใช้ไลบรารี C / C ++ กับ Automake และ Autoconf

ก่อนอื่นคุณต้องแก้ไขไฟล์ configure.ac ระดับบนสุดเพื่อเพิ่มการพึ่งพา Gtk-2.0 คุณสามารถใช้PKG_CHECK_MODULESมาโครเพื่อเรียกใช้pkg-configคำสั่ง include และไลบรารี่ที่สอดคล้องกัน - เป็นวิธีปฏิบัติที่ดีในการตรวจสอบว่า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ไลบรารีและไลบรารี


คุณคืออัจฉริยะ. ฉันแค่รอคำตอบของคุณเพราะฉันรู้ว่าคุณสามารถให้คำตอบที่เหมาะสม ขอบคุณ :)
osama
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.