ubuntuusers.de

GCC Frage und GTK.h wird nicht gefunden.

Status: Gelöst | Ubuntu-Version: Ubuntu 20.04 (Focal Fossa)
Antworten |

tom111

Anmeldungsdatum:
10. Juli 2020

Beiträge: 102

Hallo Ubuntuusers.

Benötige mal wieder eure Hilfe. Dank der Ubuntuusers die mir in meiner letzten Frage //forum.ubuntuusers.de/topic/welche-entwicklungsumgebung-bietet-echte-oop/#preview:wirklich sehr geholfen haben, habe ich mich mit GLADE angefreundet und dann festgestellt, das man eigentlich nur einen billigen Editor benötigt, um den passenden C Code einzutippen und dabei die erzeugte GLADE Widget Datei mit integriert. Diesen C-Code inklusive der GLADE XML Datei kann man dann mit dem bereits unter Ubuntu bestehenden GCC mit GTK 3.0 zu einem Programm kompilieren. Tja sollte man können, aber Ihr könnt euch sicher schon denken, das es hier ein Problem gibt, was die nächste Frage verursacht...

Aber hier erstmal mein erster Programmierversuch:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//Programm in C
//

//Libraries:
#include <gtk/gtk.h>	//GTK Library
//#include </usr/include/gtk-3.0/gtk/gtk.h>
#include <stdio.h>	//C IO Library (nicht unbedingt benötigt!)

//Variablen:
GtkWidget 	*window; 	// Hauptfenster deklarieren 
GtkLabel 	*label1; 	// Label1 deklarieren
GtkWidget	*button1;	// Button 1 deklarieren

// Hauptfunktion
int main(int argc, char *argv[])
{
	GtkBuilder	*builder; 	
	// init GTK lib bzw. GTK starten
	gtk_init(&argc, &argv);
	// add glade Files
	builder = gtk_builder_new(); 
	//GLADE Widget - File zuweisen
	gtk_builder_add_from_file(builder, "glade_test_1.glade", NULL);
	//Variable Window zuweisen
	window = GTK_WIDGET(gtk_builder_get_object(builder, "window_main"));
	//Variable Label1 zuweisen)
	label1 = GTK_WIDGET(gtk_builder_get_object(builder, "label_1"));
	//Variable Button1 zuweisen. (Vielleicht auch nicht benötigt!)
	button1 = GTK_WIDGET(gtk_builder_get_object(builder, "button_1"));
	// connect auto signal
	gtk_builder_connect_signals(builder, NULL);
	g_object_unref(builder);
	// show window
	gtk_widget_show(window);
	//Programm ausführen
	gtk_main();
	//Dringend benötigt für die C main-Funktion
	return 0;
}
//Eine Funktion die ausgeführt wird, wenn das Programm beendet wird.
void exit_app()
{
	//Schreibt in das Terminal...
	printf("Exit Programm \n");
	//Kommando zum Beenden eines GTK Programms
	gtk_main_quit(); 
}
//Eine Funktion wenn der Button 1 geklickt wird.
void on_button_1_clicked()
{
	//Schreibt in das Terminal...
	printf("Button 1 geklickt \n");
	//Ändert den Inhalt vom Label 1
	gtk_label_set_text(label_1, "HALLO");
}

Jetzt wollte ich aus dieser "main_test.c" und der dazugehörigen GLADE Datei "glade_test_1.glade" per GCC Befehl im Terminal das Ganze kompilieren und testen ob es auch das macht was es soll... Das habe ich versucht mit folgendem Terminal Eintrag:

1
gcc main_test.c -o mytest `pkg-config --cflags --libs gtk+-3.0 glade`

Leider teilt mir aber GCC mit, das "gtk.h" nicht gefunden werden kann. Habe schon mit dem folgenden Terminal-Befehl versucht zu prüfen, ob GTK überhaupt vorhanden ist.

1
2
3
4
5
6
7
itx@itx-desktop:~$ pkg-config --list-all | grep gtk
gtk+-broadway-3.0              GTK+ - GTK+ Graphical UI Library
gtk+-x11-3.0                   GTK+ - GTK+ Graphical UI Library
gtk+-3.0                       GTK+ - GTK+ Graphical UI Library
gtk+-unix-print-3.0            GTK+ - GTK+ Unix print support
gtkmm-3.0                      gtkmm - C++ binding for the GTK+ toolkit
gtk+-wayland-3.0               GTK+ - GTK+ Graphical UI Library

Sieht aber für mich soweit gut aus. Habe im Netz auch schon gesucht und eine Info gefunden, das die "gtk.h" Datei angeblich nicht im richtigen Ordner liegen soll. Die "gtk.h" Datei soll demnach unbedingt unter /usr/include/gtk-3.0/gtk/gtk.h liegen. OK habe dann halt im ordner "include" noch einen Ordner "gtk-3.0" angelegt und die "gtk.h" Datei da hinein kopiert. Hat aber auch nichts gebracht.

Deshalb bitte ich euch darum, mir wieder einmal auf die Sprünge zu helfen. Jetzt wo ich doch schon sooooo weit gekommen bin und kurz vor meinem ersten Programm unter Linux stehe. 😀

Warum in der Welt findet GCC bzw. gtk nicht seine gtk.h Datei? Sie ist doch vorhanden... Ich verstehe das nicht. Oder passt mein GCC Befehl dafür nicht? Oder fehlt irgendetwas noch, um mein erstes Linuxprogramm zum laufen zu bringen?

Danke an alle die mir hierbei weiter helfen möchten. Gruß Tom

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

tom111 schrieb:

Leider teilt mir aber GCC mit, das "gtk.h" nicht gefunden werden kann. Habe schon mit dem folgenden Terminal-Befehl versucht zu prüfen, ob GTK überhaupt vorhanden ist.

1
2
3
4
5
6
7
itx@itx-desktop:~$ pkg-config --list-all | grep gtk
gtk+-broadway-3.0              GTK+ - GTK+ Graphical UI Library
gtk+-x11-3.0                   GTK+ - GTK+ Graphical UI Library
gtk+-3.0                       GTK+ - GTK+ Graphical UI Library
gtk+-unix-print-3.0            GTK+ - GTK+ Unix print support
gtkmm-3.0                      gtkmm - C++ binding for the GTK+ toolkit
gtk+-wayland-3.0               GTK+ - GTK+ Graphical UI Library

Sieht aber für mich soweit gut aus. Habe im Netz auch schon gesucht und eine Info gefunden, das die "gtk.h" Datei angeblich nicht im richtigen Ordner liegen soll. Die "gtk.h" Datei soll demnach unbedingt unter /usr/include/gtk-3.0/gtk/gtk.h liegen. OK habe dann halt im ordner "include" noch einen Ordner "gtk-3.0" angelegt und die "gtk.h" Datei da hinein kopiert. Hat aber auch nichts gebracht.

Das klingt nicht gut. Aber vielversprechend. Du liest offenbar Fehlermeldungen - das macht nicht jeder - und versuchst Dir selbst zu helfen.

Wenn aber der ganze Ordner fehlt, dann ist das nichts, was man so von Hand fixt. Dass pkg-config die ganzen Bibliotheken findet heißt noch nicht viel, die braucht man auch, wenn man nur Programme ausführt, ohne welche zu schreiben.

Schreibt man eigene Programme, so muss man oft noch Pakete mit dem Quellcode und den Headern nachinstallieren, die dann üblicherweise das Kürzel "dev" (development) im Namen tragen.

1
sudo apt install libgtk-3-dev

wäre daher mein erster Schritt - vorher den handerstellten Ordner samt Datei am besten wegräumen, die haben dann oft falsche Berechtigungen oder Versionen.

Ich bin aber weder mit C, noch mit gtk-Development befasst. Solche Entwickler können sicher noch bessere Tipps abgeben.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11269

Wohnort: München

tom111 schrieb:

Warum in der Welt findet GCC bzw. gtk nicht seine gtk.h Datei? Sie ist doch vorhanden... Ich verstehe das nicht. Oder passt mein GCC Befehl dafür nicht?

Gibt es auf deinem Rechner wirklich eine pkgconfig-Datei glade.pc?

Wenn es die nicht gibt, schlägt der pkg-config Befehl fehl und schreibt nichts auf stdout (wodurch die Inlude-Pfade für gtk+-3.0 fehlen, wenn du in einem pkg-config Befehl Dinge für mehrere Libraries ausgeben willst) aber eine Fehlermeldung auf stderr:

$ pkg-config --cflags --libs gtk+-3.0 glade
Package glade was not found in the pkg-config search path.
Perhaps you should add the directory containing `glade.pc'
to the PKG_CONFIG_PATH environment variable
No package 'glade' found 

Du hast doch vermutlich das Paket libglade2-dev installiert und das enthält nur eine /usr/lib/x86_64-linux-gnu/pkgconfig/libglade-2.0.pc : https://packages.ubuntu.com/focal/amd64/libglade2-dev/filelist

Also probiers mal so:

gcc $(pkg-config --cflags --libs gtk+-3.0 libglade-2.0) -o mytest  main_test.c

tom111

(Themenstarter)

Anmeldungsdatum:
10. Juli 2020

Beiträge: 102

Hallo.

Danke erst einmal an User_unknown für die lobenden Worte und die Erklärung, das ein selbst erstellter Ordner nicht so einfach funktionieren kann. Werde diesen dann auch wieder löschen. Den Befehl

1
sudo apt install libgtk-3-dev

hatte ich schon ausprobiert und das Terminal meldet mir dann das bereits die neueste Version installiert sei.

Danke auch an seahawk1986 der mir ebenfalls sehr gut Hilfe leistet. Denn die Sache mit dem glade.pc bekomme ich auch angezeigt. Hatte allerdings dieses glatt vergessen noch mit in meine Frage einzubauen. War ja auch so schon lang genug... 😳 Deshalb hier meine Ausgabe des Terminals:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
itx@itx-desktop:~/projects$ gcc main_test.c -o mytest `pkg-config --cflags --libs gtk+-3.0 glade`
Package glade was not found in the pkg-config search path.
Perhaps you should add the directory containing `glade.pc'
to the PKG_CONFIG_PATH environment variable
No package 'glade' found
In file included from main_test.c:6:
/usr/include/gtk/gtk.h:30:10: fatal error: gdk/gdk.h: Datei oder Verzeichnis nicht gefunden
   30 | #include <gdk/gdk.h>
      |          ^~~~~~~~~~~
compilation terminated.

Deshalb hier erst einmal eine reine Verständnisfrage. Ich habe Glade über "Ubuntu Software" installiert. Ich gehe dann davon aus, das alles was zur Benutzung von Glade benötigt wird, auch installiert ist. Oder liegt das wieder einmal daran, das Glade als SNAP installiert ist? Denn Glade selber funktioniert ja wirklich sehr gut und ich kann damit die Widgets so erstellen wie ich es von früher her mit dem Borland Builder her kenne. Deshalb habe ich Glade auch sofort in mein Herz geschlossen und möchte auf der gtk Schiene bleiben. 😀 Somit habe ich natürlich nicht "libglade2-dev" installiert. Dadurch kommt wahrscheinlich auch die selbe Fehlermeldung über das Terminal raus wenn ich den gcc Befehl mit libglade-2.0 ausführe:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
itx@itx-desktop:~/projects$ gcc $(pkg-config --cflags --libs gtk+-3.0 libglade-2.0) -o mytest  main_test.c
Package libglade-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `libglade-2.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libglade-2.0' found
In file included from main_test.c:6:
/usr/include/gtk/gtk.h:30:10: fatal error: gdk/gdk.h: Datei oder Verzeichnis nicht gefunden
   30 | #include <gdk/gdk.h>
      |          ^~~~~~~~~~~
compilation terminated.

Was mir aber ebenfalls noch Kopfzerbrechen bereitet ist, das die gtk.h Datei wie es das Terminal ja auch ausgibt in dem Verzeichnis /usr/include/gtk/gtk.h erwartet wird. Das Verzeichnis gtk in include existiert aber nicht! Bei mir liegt die gtk.h schon immer in /usr/include/gtk-3.0/gtk/gtk.h. Und wie ich auch schon geschrieben hatte, habe ich ein GTK Verzeichnis unter include "händisch" erstellt und die gtk.h Datei dort hinein kopiert. Was allerdings nichts gebracht hatte und daran liegt wie es user_unknown bereits beschrieben hat. Auch wenn ich die exakte Pfadangabe in meinem .c File angebe erhalte ich immer im Terminal die selbe Error Meldung. Kennt bitte jemand auch eine Lösung für dieses Problem?

Also ich installiere jetzt erst einmal die "libglade2-dev", probiere es aus und melde mich dann wieder... Bis gleich. gruß Tom

tom111

(Themenstarter)

Anmeldungsdatum:
10. Juli 2020

Beiträge: 102

Hallo, da bin ich schon wieder...

Habe jetzt die "libglade2-dev" installiert und mit dem GCC Befehl wie es seahawk1986 vorgeschlagen hat ausprobiert. Habe auch das main_test.c File zu main.c umbenannt. Nicht das der "_" im Namen eventuell doch Probleme macht...

Als erstes hat sich die Frage über das finden der gtk.h Datei wahrscheinlich damit auch gelöst. Denn eine Fehlermeldung darüber erscheint im Terminal nicht mehr. Allerdings erscheinen jetzt andere Meldungen, die wie ich stark vermute an meinen Programmierfehlern liegen. Hier mal die Ausgabe des Terminals:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
itx@itx-desktop:~/projects$ gcc $(pkg-config --cflags --libs gtk+-3.0 libglade-2.0) -o mytest  main.c
main.c: In function ‘main’:
main.c:30:9: warning: assignment to ‘GtkLabel *’ {aka ‘struct _GtkLabel *’} from incompatible pointer type ‘GtkWidget *’ {aka ‘struct _GtkWidget *’} [-Wincompatible-pointer-types]
   30 |  label1 = GTK_WIDGET(gtk_builder_get_object(builder, "label_1"));
      |         ^
main.c: In function ‘on_button_1_clicked’:
main.c:62:21: error: ‘label_1’ undeclared (first use in this function); did you mean ‘label1’?
   62 |  gtk_label_set_text(label_1, "HALLO");
      |                     ^~~~~~~
      |                     label1
main.c:62:21: note: each undeclared identifier is reported only once for each function it appears in

Was die Meldungen bedeuten bzw. was diese mir sagen möchten, da habe ich absolut keine Idee. Könnte sich dass bitte mal jemand ansehen und mir bitte erklären, wodurch diese Meldungen hervorgerufen werden? Ich denke schon das es an mir selber liegt und ich etwas bezüglich des "label_1" im main.c falsch eingetippt habe. Aber was könnte es sein? Ich danke euch für eure Hilfe, mit der ich doch schon so weit gekommen bin und bestimmt mein erstes Programm unter Linux bald zum laufen bekomme. Wenn das erst einmal vollbracht ist, wird das jetzige main.c File in Gold graviert damit ich dieses dann immer als Startanleitung für weitere Versuche habe!

Gruß Tom

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11269

Wohnort: München

Da passen die Pointer-Typen nicht zusammen - woher hast du denn den Code und wie sieht die glade_test_1.glade aus, damit man das mal nachstellen kann?

Generell würde ich vermuten, dass label1 ein Pointer auf ein ´GtkWidget statt ein GtkLabel sein sollte.

tom111

(Themenstarter)

Anmeldungsdatum:
10. Juli 2020

Beiträge: 102

Hallo da bin ich nochmals...

Habe jetzt das Probelm mit dem label_1 in Zeile 62 gefunden. Es muss hier die deklarierte Variable label1 und nicht der ID-Name label_1 angegeben werden. Habe dann nochmals einen Versuch gemacht und bekomme jetzt folgende Terminal Ausgabe:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
itx@itx-desktop:~/projects$ gcc $(pkg-config --cflags --libs gtk+-3.0 libglade-2.0) -o mytest  main.c
main.c: In function ‘main’:
main.c:29:9: warning: assignment to ‘GtkLabel *’ {aka ‘struct _GtkLabel *’} from incompatible pointer type ‘GtkWidget *’ {aka ‘struct _GtkWidget *’} [-Wincompatible-pointer-types]
   29 |  label1 = GTK_WIDGET(gtk_builder_get_object(builder, "label_1"));
      |         ^
/usr/bin/ld: /tmp/ccgcj3qe.o: in function `main':
main.c:(.text+0x23): undefined reference to `gtk_init'
/usr/bin/ld: main.c:(.text+0x28): undefined reference to `gtk_builder_new'
/usr/bin/ld: main.c:(.text+0x44): undefined reference to `gtk_builder_add_from_file'
/usr/bin/ld: main.c:(.text+0x49): undefined reference to `gtk_widget_get_type'
/usr/bin/ld: main.c:(.text+0x5f): undefined reference to `gtk_builder_get_object'
/usr/bin/ld: main.c:(.text+0x6a): undefined reference to `g_type_check_instance_cast'
/usr/bin/ld: main.c:(.text+0x76): undefined reference to `gtk_widget_get_type'
/usr/bin/ld: main.c:(.text+0x8c): undefined reference to `gtk_builder_get_object'
/usr/bin/ld: main.c:(.text+0x97): undefined reference to `g_type_check_instance_cast'
/usr/bin/ld: main.c:(.text+0xa3): undefined reference to `gtk_widget_get_type'
/usr/bin/ld: main.c:(.text+0xb9): undefined reference to `gtk_builder_get_object'
/usr/bin/ld: main.c:(.text+0xc4): undefined reference to `g_type_check_instance_cast'
/usr/bin/ld: main.c:(.text+0xdc): undefined reference to `gtk_builder_connect_signals'
/usr/bin/ld: main.c:(.text+0xe8): undefined reference to `g_object_unref'
/usr/bin/ld: main.c:(.text+0xf7): undefined reference to `gtk_widget_show'
/usr/bin/ld: main.c:(.text+0xfc): undefined reference to `gtk_main'
/usr/bin/ld: /tmp/ccgcj3qe.o: in function `exit_app':
main.c:(.text+0x121): undefined reference to `gtk_main_quit'
/usr/bin/ld: /tmp/ccgcj3qe.o: in function `on_button_1_clicked':
main.c:(.text+0x14e): undefined reference to `gtk_label_set_text'
collect2: error: ld returned 1 exit status

Nun eine erneute Katastrophe... Was bitte soll man denn damit anfangen??? Da stimmt ja dann alles nicht. 😢 Hat bitte jemand von euch eine Idee was es denn damit auf sich hat? Ich danke euch. Gruß Tom

tom111

(Themenstarter)

Anmeldungsdatum:
10. Juli 2020

Beiträge: 102

Hallo seahawk1986.

hier mal die glade Datei:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.2 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkWindow" id="window_main">
    <property name="can_focus">False</property>
    <property name="default_width">500</property>
    <property name="default_height">500</property>
    <signal name="destroy" handler="exit_app" swapped="no"/>
    <child type="titlebar">
      <placeholder/>
    </child>
    <child>
      <object class="GtkFixed" id="fixed_1">
        <property name="name">fixed</property>
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkButton" id="button_1">
            <property name="label" translatable="yes">button</property>
            <property name="name">Button</property>
            <property name="width_request">100</property>
            <property name="height_request">40</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="tooltip_text" translatable="yes">Das ist der Button 1</property>
            <signal name="clicked" handler="on_button_1_clicked" swapped="no"/>
          </object>
          <packing>
            <property name="x">10</property>
            <property name="y">10</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label_1">
            <property name="name">Label</property>
            <property name="width_request">100</property>
            <property name="height_request">40</property>
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="tooltip_text" translatable="yes">Das ist das Label 1</property>
            <property name="label" translatable="yes">label</property>
          </object>
          <packing>
            <property name="x">120</property>
            <property name="y">10</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

Hoffe das der Inhalt der Glade Datei so gut ersichtlich ist. Gruß Tom

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11269

Wohnort: München

Die Warnung hast du immer noch nicht beseitig und der Rest danach ist ein Problem des Linkers beim Auflösen der Symbole - das passiert, weil die Reihenfolge der Argument für die cflags und libs nicht passt - probier es mal so:

gcc $(pkg-config --cflags gtk+-3.0 libglade-2.0) -o mytest  main.c $(pkg-config --libs gtk+-3.0 libglade-2.0) 

tom111

(Themenstarter)

Anmeldungsdatum:
10. Juli 2020

Beiträge: 102

Hallo seahawk1986.

Also den Fehler mit dem label_1 in Zeile 62 konnte ich zwar beheben den Fehler in Zeile 30 jedoch nicht. Deshalb habe ich jetzt das gesamte label_1 mit "//" abgeschaltet und deinen Vorschlag des GCC Befehls ausgeführt. Dieser hat auch bestens funktioniert, hat keinerlei Fehlermeldungen produziert und das ausführbare Programm namens "mytest" wurde auch angelegt. Allerdings wenn ich dann im Terminal "mytest" mit dem Eintrag ./mytest starten möchte kommen wieder andere Fehlermeldungen...

1
2
3
4
5
6
7
8
9
itx@itx-desktop:~/projects$ gcc $(pkg-config --cflags gtk+-3.0 libglade-2.0) -o mytest  main.c $(pkg-config --libs gtk+-3.0 libglade-2.0) 
itx@itx-desktop:~/projects$ ./mytest

(mytest:10313): GLib-GObject-WARNING **: 12:12:18.955: cannot register existing type 'GdkDisplayManager'

(mytest:10313): GLib-CRITICAL **: 12:12:18.955: g_once_init_leave: assertion 'result != 0' failed

(mytest:10313): GLib-GObject-CRITICAL **: 12:12:18.955: g_object_new_with_properties: assertion 'G_TYPE_IS_OBJECT (object_type)' failed
Speicherzugriffsfehler (Speicherabzug geschrieben)

Ach ja... und weitere Fragen die sich mir stellen womit ich als Anfänger so mal gar nichts mit anfangen kann und nur auf eure Hilfe setzen kann.

Die main.c Datei habe ich mir aus anderen Beiträgen hier im Forum und aus anderen Internetseiten so zusammengestellt. Das hier die Reihenfolgen nicht stimmen, kann gut möglich sein. Ich konnte die Reihenfolgen nur so anwenden wie ich diese in den entsprechenden Code vorgefunden hatte.

Könntest du eventuell mir bitte mal einen ganz kleinen primitiven Anfangscode hier einstellen, woran ich erkennen kann, wie die richtigen Reihenfolgen sind? Das würde bestimmt nicht nur mir zum Start in die Linux Programmierwelt helfen.

Danke und Gruß Tom

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11269

Wohnort: München

tom111 schrieb:

Also den Fehler mit dem label_1 in Zeile 62 konnte ich zwar beheben den Fehler in Zeile 30 jedoch nicht. Deshalb habe ich jetzt das gesamte label_1 mit "//" abgeschaltet und deinen Vorschlag des GCC Befehls ausgeführt. Dieser hat auch bestens funktioniert, hat keinerlei Fehlermeldungen produziert und das ausführbare Programm namens "mytest" wurde auch angelegt. Allerdings wenn ich dann im Terminal "mytest" mit dem Eintrag ./mytest starten möchte kommen wieder andere Fehlermeldungen...

1
2
3
4
5
6
7
8
9
itx@itx-desktop:~/projects$ gcc $(pkg-config --cflags gtk+-3.0 libglade-2.0) -o mytest  main.c $(pkg-config --libs gtk+-3.0 libglade-2.0) 
itx@itx-desktop:~/projects$ ./mytest

(mytest:10313): GLib-GObject-WARNING **: 12:12:18.955: cannot register existing type 'GdkDisplayManager'

(mytest:10313): GLib-CRITICAL **: 12:12:18.955: g_once_init_leave: assertion 'result != 0' failed

(mytest:10313): GLib-GObject-CRITICAL **: 12:12:18.955: g_object_new_with_properties: assertion 'G_TYPE_IS_OBJECT (object_type)' failed
Speicherzugriffsfehler (Speicherabzug geschrieben)

Ach ja... und weitere Fragen die sich mir stellen womit ich als Anfänger so mal gar nichts mit anfangen kann und nur auf eure Hilfe setzen kann.

Wie schon geschrieben die Pointer-Typen passen nicht zusammen und dann knallt es, weil die Datenstrukturen nicht kompatibel sind.

Die main.c Datei habe ich mir aus anderen Beiträgen hier im Forum und aus anderen Internetseiten so zusammengestellt. Das hier die Reihenfolgen nicht stimmen, kann gut möglich sein. Ich konnte die Reihenfolgen nur so anwenden wie ich diese in den entsprechenden Code vorgefunden hatte.

Könntest du eventuell mir bitte mal einen ganz kleinen primitiven Anfangscode hier einstellen, woran ich erkennen kann, wie die richtigen Reihenfolgen sind? Das würde bestimmt nicht nur mir zum Start in die Linux Programmierwelt helfen.

Die erste Frage, die ich mir sich stellen würde ist, ob man überhaupt mit C und GUI-Programmierung in GTK starten will, denn das ist beides recht komplex. Mit C hat man (wie mit C++) viel Potential, um sich unangenehm in den Fuß zu schießen - gerade wenn man am Anfang noch nicht genau weiß, was man tut. Für die ersten Schritte würde ich CLI-Programme schreiben, eine GUI ist dann eine spätere Ergänzung, die keine größeren Anpassungen benötigen sollte, wenn man sich ans das Model View Controller-Muster hält.

Mit Python kann man z.B. auch GTK-Anwendungen bauen und dabei viel Zeit und Nerven sparen, weil man sich nicht selbst mit gcc und ld herumschlagen muss:

Wenn man es stringenter haben will und einen Compiler mit hilfreichen Fehlermeldungen schätzt, wäre Rust eine Idee:

Wenn es unbedingt C sein soll, solltest du IMHO erst mal C lernen und soweit kommen, dass du die Fehlermeldungen von Compiler und Linker nachvollziehen (Suchmaschinen sind dein Freund) und selbstständig beheben kannst, bevor du dich an GUI-Code wagst und dann könnte https://prognotes.net/gtk-glade-c-programming/ hilfreich sein.

Axel-Erfurt

Anmeldungsdatum:
18. Mai 2016

Beiträge: 1347

seahawk1986 schrieb:

Mit Python kann man z.B. auch GTK-Anwendungen bauen und dabei viel Zeit und Nerven sparen, weil man sich nicht selbst mit gcc und ld herumschlagen muss:

👍

Mein Tipp wäre noch wenn man es wirklich lernen will keine GUI Desiger zu benutzen.

tom111

(Themenstarter)

Anmeldungsdatum:
10. Juli 2020

Beiträge: 102

Hallo seahawk1986 und auch Axel-Erfurt.

Danke für eure Hilfe und die tollen Tipps. Ja ich sehe es vollkommen ein, das eine GUI Programmierung mit GTK wahrscheinlich dann doch etwas ambitioniert gewesen ist und ein Problem das andere jagt, welches man nicht selber lösen kann, weil man sich halt nicht so gut damit auskennt.

Werde mir jetzt mal die Links ansehen und weitere Informationen damit einholen. Hatte auch schon mal vor Jahren unter W... mit Python was gemacht. Eventuell wird das vielleicht dann doch besser sein. Muss mich aber auch hier erst mal unter Linux in Python rein finden. Linux ist halt nicht W... und das ist auch gut und richtig so! 😉

Danke nochmals an alle die sich die Zeit genommen haben, mir bei meinem Start in die Linux Programmierwelt zu helfen. Das hat mir sehr geholfen, mich in dem Dickicht der ganzen Möglichkeiten weiter zurecht zu finden.

Danke und Gruß Tom.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

Und beim Posten von Fehlermeldungen wie:

1
2
3
4
5
6
7
itx@itx-desktop:~/projects$ gcc $(pkg-config --cflags --libs gtk+-3.0 libglade-2.0) -o mytest  main.c
main.c: In function ‘main’:
main.c:29:9: warning: assignment to ‘GtkLabel *’ {aka ‘struct _GtkLabel *’} from incompatible pointer type ‘GtkWidget *’ {aka ‘struct _GtkWidget *’} [-Wincompatible-pointer-types]
   29 |  label1 = GTK_WIDGET(gtk_builder_get_object(builder, "label_1"));
      |         ^
/usr/bin/ld: /tmp/ccgcj3qe.o: in function `main':
main.c:(.text+0x23): undefined reference to `gtk_init'

Da solltest Du den ganzen Block, in dem Zeile 29 steht, posten. Fast immer gilt es die Fehler von oben nach unten abzuarbeiten, weil spätere Fehler oft Folgefehler sind.

In Deinem Code sehen wir eine misslungene Zuweisung, aber wir sehen nicht, wie label1 deklariert ist. Ist das nicht im gleichen Block deklariert? Gute Praxis ist "declaration on initialisation", also die Variable in dem Moment erst zu deklarieren, wo sie im Code gebraucht wird.

Wer einen Fehler im davor liegenden Code sucht, muss sich dann um diese Variable nicht scheren - da sie noch nicht deklariert ist, kann sie nichts mit dem Problem zu tun haben. Umgekehrt vergisst man so seltener, Variablen auch zu initialisieren.

Immer lässt sich das nicht durchhalten aber dennoch sollte man die Deklaration auf so spät wie möglich verschieben.

Pseudocodebeispiel:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
    XFrame frame
    if (modus == root) 
    {
         frame = new RootFrame (pwdDialog(pwdMessage))      
    }
    else 
    {
         frame = new UserFrame ()      
    }
    frame.add (menu)
    // ...
}

Würde man hier in der Verzweigung deklarieren wäre die Variable außerhalb der Blöcke wieder unbekannt. (Könnte man evtl. mit einem ternären Operator lösen, in dem Fall, aber das Problem ist oft komplexer und das mit Dekl./Initial. ist nur eine Faustformel, kein Gebot an das man sich sklavisch halten soll.

Wollte noch mehr sagen, aber der Markt ruft, der macht gerade zu - ich brauch noch Geflügel!

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

1
2
3
4
itx@itx-desktop:~/projects$ gcc $(pkg-config --cflags gtk+-3.0 libglade-2.0) -o mytest  main.c $(pkg-config --libs gtk+-3.0 libglade-2.0) 
itx@itx-desktop:~/projects$ ./mytest

(mytest:10313): GLib-GObject-WARNING **: 12:12:18.955: cannot register existing type 'GdkDisplayManager'

Ja, das erinnert mich an meine Programmieranfänge.

Erst lernt man die Sprache, und dann hat man die Frage, wie man die Farbe eines Pixels auf dem Bildschirm bestimmt.

Dann findet man Hinweise, eine Klasse wie GraficContext habe eine Methode getPixel (int x, int y). Prima. Schaut man sich dann den Constructor von GraficContext an, versteht man nur Bahnhof und je tiefer man in die Materie vordringt, desto mehr Bahnhof versteht man.

Oft fehlt in der Doku, oder ist gut versteckt, wie das alles zusammenwirkt. Den Grafikkontext bekommt man vom System aber für das System muss man eine bestimmte Initialisierungssequenz von 2, 3 Programmzeilen einhalten, dann kann man von ihm einen GC bekommen, oder man erzeugt erst ein grafisches Object, in Java etwa einen JFrame, und den kann man dann nach dem GC fragen, aber den Ctor ruft man nie explizit selbst auf.

Solange man nicht selbst derartige Bibliotheken entwickelt muss man die Details dessen, was hinter den Kulissen vorgeht, gar nicht verstehen. Aber egal welche Bibliothek man benutzt - man braucht fast immer ein Einsteigerbuch/-Tutorial, um über die Anfangshürden zu kommen. Man würde dem allen mal auf den Grund gehen, wenn es nicht immer 532 konkurrierende Fragestellungen gäbe, denen man auch schon lange mal auf den Grund gehen wollte.

Antworten |