C-Tutorial Kapitel Verwendung externer Librarys

Diskussionen zu Tutorials, Änderungs- und Erweiterungswünsche
Antworten
Ramnad
Beiträge: 12
Registriert: Do Okt 29, 2015 3:10 pm

C-Tutorial Kapitel Verwendung externer Librarys

Beitrag von Ramnad » Do Nov 26, 2015 11:07 am

Hi,

ich hab mal wieder einpaar fragen zum obengenannten tutorial.
1. also ich habe die library gtk+ soweit korrekt installiert und zur path-variable hinzugefügt. der pfad lautet bei mir: C:\Program Files (x86)\GTK2-Runtime\bin
dann habe die weiteren anweisungen im unterkapitel "Ein Programm mit Hilfe von externen Librarys bauen" befolgt und wollte jetzt das beispielprogramm kompillieren mit folgendem befehl im comandwindow:
gcc -o beispielprogramm.exe beispielprogramm.c

leider bekomme ich die fehlermeldung das er die datei gtk.h nicht findet(wenn ich das richtig verstehe)
beispielprogramm.c:1:21: fatal error: gtk/gtk.h: No such file or directory
#include <gtk/gtk.h>
^
compilation terminated

in der path variable ist der pfad enthalten und ich konnte auch die demo öffnen weiß jemand wo mein fehler ist?

so nun die anderen fragen:
2. was genau sind die cflags die ich vorher einlade sind das die include dateien? wenn ja warum muss ich das machen habe ich das nicht bereits damit erledigt das ich den pfad der gtk+ bibliothek in der variable path eingetragen habe?
3. was genau ist der linker also im vorherigen kapitel wurde ja kurz erläutert dass es ein programm zum linken der objectfiles ist. ist es also ein programm was vom betriebssystem kommt?
4. das einlesen der cflags und libs muss ich das jedesmal neu machen wenn ich das commandwindow öffne oder ein programm kompillieren will?

eine kleine anmerkung noch im unterkapitel "Ein Programm mit Hilfe von externen Librarys bauen" wird der commandwindow befehl "pkg-config –list-all" erwähnt, dieser müsste meine ich "pkg-config -–list-all" also doppelter bindestrich lauten.

tut mir leid für die vielen Fragen ich hoffe ihr findet die zeit kurz drübe zu schauen.

Viele Grüße
Ramnad

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8507
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C-Tutorial Kapitel Verwendung externer Librarys

Beitrag von Xin » Do Nov 26, 2015 12:16 pm

Ramnad hat geschrieben: gcc -o beispielprogramm.exe beispielprogramm.c

leider bekomme ich die fehlermeldung das er die datei gtk.h nicht findet(wenn ich das richtig verstehe)
beispielprogramm.c:1:21: fatal error: gtk/gtk.h: No such file or directory
#include <gtk/gtk.h>
^
compilation terminated

in der path variable ist der pfad enthalten und ich konnte auch die demo öffnen weiß jemand wo mein fehler ist?
Die Path-Variable muss beinhalten, wo die *.dll Files sind.
Mit den Includes hat das noch nichts zu tun.
Ramnad hat geschrieben: so nun die anderen fragen:
2. was genau sind die cflags die ich vorher einlade sind das die include dateien? wenn ja warum muss ich das machen habe ich das nicht bereits damit erledigt das ich den pfad der gtk+ bibliothek in der variable path eingetragen habe?
Die Path Variable erweiterst Du, damit Dein kompiliertes Programm die DLLs findet. Das hat aber nichts mit dem Kompilieren zu tun.

Der Compiler benötigt die Include-Pfade und die Information, wo er die .lib Dateien (bzw. .a-Dateien) findet, um die DLLs anzusprechen. Aber beim Compilieren werden die DLLs nicht benötigt.
Die Verzeichnisse zu den Include-Directories und zu den Libs, sowie die Information, welche LIbs überhaupt verwendet werden, wird dem Compiler beim Aufruf über sogenannte Flags mitgeteilt. Genauso, wie Du über das -o Flag sagst, wie das compilierte Programm hei0en soll.
Ramnad hat geschrieben: 3. was genau ist der linker also im vorherigen kapitel wurde ja kurz erläutert dass es ein programm zum linken der objectfiles ist. ist es also ein programm was vom betriebssystem kommt?
Der Linker ist ein Programm, das mit dem Compiler zusammen kommt. Der gcc ruft den Linker für Dich auf, wenn Du kein Objectfile erzeugst, sondern ein .exe
Ramnad hat geschrieben:4. das einlesen der cflags und libs muss ich das jedesmal neu machen wenn ich das commandwindow öffne oder ein programm kompillieren will?
Ja.

Ich habe in der Lektion zwei Eingabefenster mit allen Flags abgebildet. Diese ganze Ausgabe von pkg-config muss an den Compileraufruf angehängt werden, damit Du in der Konsole das lauffähige Programm hast.

Und nein.
Die meisten Entwickler schreiben sich ein kleines Skript, was den Compileraufruf speichert, damit man ihn nicht jedesmal zusammenbauen muss. Das kann ein Batch-Skript sein, häufig wird aber Make verwandt. Auch dafür ist das passende Beispiel verlinkt.
Ramnad hat geschrieben: eine kleine anmerkung noch im unterkapitel "Ein Programm mit Hilfe von externen Librarys bauen" wird der commandwindow befehl "pkg-config –list-all" erwähnt, dieser müsste meine ich "pkg-config -–list-all" also doppelter bindestrich lauten.

tut mir leid für die vielen Fragen ich hoffe ihr findet die zeit kurz drübe zu schauen.
Danke für den Hinweis, ich finde die fragliche Stelle aber gerade nicht?!(*)

Das Forum ist dafür da, dass man Fragen stellen kann. Andersrum bedeutet es ja auch, dass die Texte nicht umsonst geschreiben werden und jemand sich da durcharbeitet. :)


(*) PS: Nicht gefunden, weil da ein langer Strich und kein - stand. Der lange Strich wird vom Wiki erzeugt, wenn man -- schreibt... m(
Die Anzeige ist korrigiert, danke für den Hinweis. :)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3091
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: C-Tutorial Kapitel Verwendung externer Librarys

Beitrag von cloidnerux » Do Nov 26, 2015 12:39 pm

leider bekomme ich die fehlermeldung das er die datei gtk.h nicht findet(wenn ich das richtig verstehe)
beispielprogramm.c:1:21: fatal error: gtk/gtk.h: No such file or directory
Du musst deinem Compiler noch mitteilen, dass er nach Header Dateien auch in einem anderen Ordner außer dem "Standard" Ordner suchen soll:

Code: Alles auswählen

gcc -o beispielprogramm.exe beispielprogramm.c -IC:\Program Files (x86)\GTK2-Runtime\include
(Sollte es den include Ordner an dieser stelle nicht geben einmal danach suchen).
was genau ist der linker also im vorherigen kapitel wurde ja kurz erläutert dass es ein programm zum linken der objectfiles ist. ist es also ein programm was vom betriebssystem kommt?
Der Prozess aus deinem Code ein Ausführbares Programm zu erzeugen ist Zweischrittig, auch wenn das erstmal nicht offensichtlich ist.
Im ersten Schritt wird dein Code zu einer Objektdatei gewandelt, das macht dein Compiler. Diese Objektdatei enthält aber keine externe Funktion, sondern nur die Information das dorthin gesprungen werden soll.
Wenn du also "stdio.h" einbindest, bindest du eine Headerdatei ein, die Funktionsprototypen beinhaltet, z.B die Funktion "printf". Damit teilst du deinem Compiler also mit, dass es irgendwo eine Funktion gibt, die "printf" heißt, bestimmte Parameter entgegen nimmt und irgendwas zurück gibt. In der Header Datei steht aber nicht der Code von printf. Wenn du das Programm compilierst wird der Compiler den Aufruf zu printf nur durch den Hinweis ersetzten, dass eine Funktion printf aufgerufen werden soll.
Du kompilierst alle Code-Dateien zu einer eigenen Objektdatei.

Nun kommt der Linker ins spiel. Der Linker hat nun die Aufgabe, die ganzen Objektdateien mit den Librarys zu verknüpfen(link) und alle Vermerke des Compilers, eine noch unbekannte Funktion aufzurufen, durch die tatsächliche Funktion zu ersetzten.
Diese beiden schritte machst du auch implizit, wenn du gcc einweist direkt eine ausführbare Datei zu erzeugen.

Warum macht man das ganze?
Da der Compiler sich nicht darum kümmern muss, ob eine Funktion tatsächlich implementiert ist, sondern sich damit zufrieden gibt, dass es ein Prototyp gibt, kannst du alle Code-Dateien unabhängig voneinander compilieren, damit auch Parallel. Keine Code-Datei ist darauf angewiesen, dass eine andere Code-Datei compiliert ist.
Nachdem alles compiliert wurde, kann der Linker dann das Programm zusammen bauen.
Weiterhin ermöglicht es inkrementelles Bauen, weil man Code, der sich nicht geändert hat, auch nicht neu compilieren muss.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Ramnad
Beiträge: 12
Registriert: Do Okt 29, 2015 3:10 pm

Re: C-Tutorial Kapitel Verwendung externer Librarys

Beitrag von Ramnad » Do Nov 26, 2015 4:44 pm

Hi zusammen vielen dank für die ausführlichen antworten :)

aber eine sache noch ihr habt geschrieben ich muss dem compiler mitteilen wo er nach den header dateien suchen soll.
das habe ich nun gemacht. das problem ist aber das ich fas für jede header dateien einen pfad zu ihr angeben muss, also wenn sie nicht in einem der schon angegeben pfade drin ist.
heist also ich kann nicht schreiben
gcc -o programm.exe programm.c -I D:\Programme\GTK+2.24\include
also in dem sinne "da sind alle dateien drinne die du brauchst such sie dir raus"

sondern
gcc -o lektion25.exe lektion25.c -I D:\Programme\GTK+2.24\include\gtk-2.0 -I D:\Programme\GTK+2.24\include\glib-2.0 -I D:\Programme\GTK+2.24\lib\glib-2.0\include usw.

das ist ziemlich aufwendig auch wen man es mit einer .bat-datei macht muss ja die pfade trotzdem hinzufügen, kann man das nicht irgendwie umgehen?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8507
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C-Tutorial Kapitel Verwendung externer Librarys

Beitrag von Xin » Do Nov 26, 2015 9:57 pm

Nein, das kann man nicht umgehen. Woher soll der Compiler schließlich Deine Festplatte kennen?
Und Du willst auch nicht alle Header-Dateien in ein Verzeichnis zusammenkopieren.

Du kannst unter Linux Dir alles mit pkg-config in den Aufruf schreiben lassen, aber auch das willst Du nicht laufend tippen.
Mach ein Makefile, dann musst Du nur "make" tippen und fertig.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Ramnad
Beiträge: 12
Registriert: Do Okt 29, 2015 3:10 pm

Re: C-Tutorial Kapitel Verwendung externer Librarys

Beitrag von Ramnad » Do Nov 26, 2015 10:54 pm

ok alles klar dann bin ich soweit erleuchtet :)
danke nochmal für die Hilfe

Viele Grüße
Ramnad

Antworten