Kleine Programmier fragen

R

rdg

???
Hi,

ich wollte fragen was der Unterschied zwischen eine Includdatei und einer Bibliothek ist?
Also wie ich herrausbekomme ob ich die g++ Option
-Idirname oder
-Ldirname angeben muss?
Dazu wenn ich
-Ldirname angegeben habe, warum muss ich extra noch -lname angeben?

Und:
was ist der Unterschied zwischen #include"" und #include<>?
 
zu 1. kann ich dir leider nicht helfen
zu 2. das hat was mit suchpfaden und absolutpath zu tuhn. aber was nun was ist weiss ich auch nicht genau würde aber vermuten dass <> für libs im std order und "" für libs die "irgentwo" liegen.
 
zu 2. das hat was mit suchpfaden und absolutpath zu tuhn. aber was nun was ist weiss ich auch nicht genau würde aber vermuten dass <> für libs im std order und "" für libs die "irgentwo" liegen.

#include <iostream> (als einfaches Anfänger Beispiel) fügt sucht die lib in dem c++ include Pfad, wenn du stattdessen #include "iostream" schreibst versucht er die Datei aus dem aktuellen Verzeichnis zu laden.

Die "" Variante sollte man z.B. für Header Dateien benutzen. In die *.h Datei würden dann die Klassen Definitionen kommen.
 
Also ist <> für Bibliotheken
und "" für Headerdateien im Verzeichnis

alles klar, vielen dank !

Wahscheinlich ist der Unterschied zwischen einer Bibliothek und einer .h einfach das die Bibliothek schon kompiliert ist. Würde ich jetzt mal annehmen.
 
ich wollte fragen was der Unterschied zwischen eine Includdatei und einer Bibliothek ist?
Nennen wir das Ding mal besser Header-Datei, das ist eindeutiger definiert.
Was in den Header-Dateien steckt sind Schnitstellen, also beispielsweise Funktionsprototypen. In der Bibliothek steckt die Implementierung dieser Schnittstellen (in Form von Maschinencode).

Zu den anderen Fragen:
Mittels -Idirname gibt man an, in welchen Verzeichnissen nach zu inkludierenden Dateien gesucht werden soll.
mit -Ldirname gibt man dann die Verzeichnisse an, in denen nach Bibliotheken gesucht werden soll, gegen die das Programm gelinkt werden soll.
Und mit -lname gibt man letztendlich die Namen der Bibliotheken an, gegen die das Programm gelinkt werden soll.
 
Also

unterschied zwischen Lib und Header Datei.

Also eine Header-datei. Unter C mit der Endung .h und unter C++ meist gar keine, .h kann aber noch imm verwendet werden. In einer Header-Datei können Funktionen/ Strukturen /Uions / Enums/ Typen definiert. Wozu das ganz? Naja wenn Projekte größer als eine Datei werden und das tun sie in der Regel auch dann muss man eine Möglichkeit finden jeder .c/cpp Datei mitzuteilen welche Funktionen verfügbar sind welche werte übergeben werden müssen. Da ja zuerst jedes File für sich kompiliert wird weiß es noch nichts von anderen Files zu diesem zweck erstellt man eine .h. Sie wird aber auch verwendet um den Sourcefile mitzuteilen welche Funktionen in den librarys stecken und zum späteren zeitpunkt hinzu gelinkt werden.

Eine Library oder Lib ist eine "grob" Sammlung von Funktionen die meist Allgemein gehalten werden So das sie von mehreren Person/Programmen benutzt werden können. Man unterscheitet zwischen dynamischen Libs die sich schon vor Laufzeit eines Programmes (wenn die lib schon aufgerufen wurde) im Ram befinden und von allen Programmen benutzt werden können. Der Vorteil ist das man nur eine Lib benötigt die nur einmal in den Ram geladen werden muss. Und statische Libs werden zu jedem Programm statisch hinzu gelinkt. Das heißt der quellcode einer Lib fließt in den Coder der Ausführbaren-datei ein. Vorteil: Der Entwickler weiß woran er ist, stellt damit auch sicher das das Programm auf den meisten Rechnern läuft. (was bei dyn libs nicht der fall ist wenn sie nicht installiert sind). Nachteil die Lib wird wenn es 200 Programme gibt die sie benutzen immer in die Datei mit eingebunden und so entsteht erhöhter Daten verbrauch auf der Festplatte.

edit: alles was mit #include hinzugefügt wird sind Header-Dateien. Wenn <> verwendet wird liegt die header Datei in einem speziellen Verzeichnis unter Debian /usr/include . Außer es wird etwas explizit angegeben. Mit "" wird die Header-Datei aus dem Lokalen Verzeichnis eingebunden. zb das source file liegt in /home/user/dev/main.c und ein Header file wird mit #include "main.h" eingebunden dann sucht der Compiler in /home/user/dev/ nach der Header-datei. Außer es wird beim compilieren etwas explizit angegeben.(ein anderer Ordner)


unter http://www.tutorials.de/forum/linux-tutorials/243221-libs-unter-linux.html findest du ne kleine Anleitung zum erstellen von Librarys...

mfg manhunt
 
Zuletzt bearbeitet:
Erstmal vielen dank,
jetzt versteh ich den unterschied Bibliothek und header deutlich besser,
vor allem der link hilft mir da seht, vielen dank, bin noch beim studieren.


jetzt klart alles langsam auf, vielen dank!

Beim Link:
Warum -ltest
Wenn es ibtest.a heißt?
 
Zuletzt bearbeitet:
Also

nochmal kurz.

Statisch:

.c/cpp werden meist zu .o Object dateien Compiliert.

main.c ->compiliert->main.o
irgendwas.c->compiliert->irgendwas.o

Diese *.o dateien werden dann zusammen mit den .a (stat libs) gelinkt. (Also verbunden zu einer Datei)

Also main.o && irgendwas.o && libname.a -> Ausführbare Datei.

Das heißt die Lib kommt ins Programm.


Dynamisch:

main.c ->compiliert->main.o
irgendwas.c->compiliert->irgendwas.o

Also main.o && irgendwas.o && -shared libname.so -> Ausführbare Datei

Das heißt die Lib wird zur Laufzeit in den Ram geladen und alle andren Programmen können sie benutzen...

Nochetwas unter Linux habe libs immer einen speziellen Namen. ZB libtest.so das heißt der Name einer lib besteht immer aus lib +name+.so

Deshalb brauchst du beim compilieren von Programmen die die libtest.a benötogen nur -ltest übergeben also nur den Namen. Das da noch ein "lib" davor und ein ".so" danach ist ist Standart und braucht nicht explizit angegeben werden...


Achja wenn du mal nach "/usr/lib" (unter Debian) schaust wird dir auffallen das es da mehrere gleiche Lib gibt. zb "libaudio.so" und "libaudio.so.2" die Nummern geben auf Schluss über die Version wobei es dafür keinen wirklichen Standart gibt.... Meist sind es auch nur Links zur aktuellsten Version der Lib. Da meistens darauf geachtet wird das libs Abwärtskompatibl sind macht man meist einen link und nicht unnötig platz zu verschwenden....

mfg manhunt
 
Zuletzt bearbeitet:
Alles klar

vielen dank dir manhunt,
und echt klasse erklärt !!! :))

gruß
rdg
 
Noch was

Wenn du später programmierst und libs von anderen Leuten benutzt musst du unter ubuntu, debian und co meist die "-dev" packete nach installieren wenn nur die lib (also .so Dateien) installiert sind. In den Paketen sind die Header Dateien enthalten die zwar für den Betrieb der Libs nicht nötig sind da ein anderer die Programme compiliert hat. Aber du als programmierer brauchst Sie zum comp.......

Diese header landen dann meist im Standardverzeichnis "/usr/include" und werden dann mit <> eingebunden......

mfg manhunt
 
Zuletzt bearbeitet:
darauf wär ich hereingefallen.

Das muss man erst einmal wissen.:think:

Hatte mal ein ähnliches Problem, da wusste ich nicht das ich alle .cpp's beim g++ mit angeben muss. Bin damals halb wahnsinnig geworden, weil offensichtlich alles richtig war und ich alles 100 mal nachkontrolliert habe.
 
Da wärest du schnell drauf gekommen wenn du versucht hättest was einzubinden und ne Meldung kommt das die Datei header.h nicht existiert...

Achja Libs legen meist einen eigenen Ordner in include an. zb <gtk/gtk.h> ("/usr/include/gtk/gtk.h" wäre der ganze Pfad...)

achja es stärkt das Verständnis wie große Projekte arbeiten wenn man mit make arbeitet.... (und vieleicht später mit ner Versionscontroll) Wobei große Projekte oft automatisch erstellte Makefiles benutzen die für den Menschen schlecht lesbar sind...

http://www.pronix.de/pronix-547.html (Da gibts noch anderes nützliches....)

mfg manhunt
 
Zuletzt bearbeitet:
Doch noch eine kleine Verständnisfrage.

Wie lautet der gcc Befehle, welcher beim kompilieren des Programmes die dynamischen Bibliothek mit einbindet?

gcc -o test test.c -L. -I. ???

Das ging nämlich leider nicht eindeutig aus dem Tutorial hervor, oder ich habe es nicht richtig verstanden.
 
Hallo


Sorry für die Wartezeit bin net so oft hier online...

Normaler weiße erzeugt man (oder frau :D ) von jeder Lib die er schreibt eine Statische und eine Dynamische Version. Beim compilieren wird Standard mäßig dyn gelinkt. Mit
Code:
-static
kann man an geben ob nur statisch gelinkt wird.

Also:
Code:
 gcc -o test main.c -static -lm
würde die nicht die libm.so sondern die libm.a statisch linken.

Achja wie ich schon gesagt habe auf http://www.pronix.de/pronix-562.html gibts noch mehr interessantes für dich.(was du bestimmt noch nicht weißt)


Achja natürlich funktioniert das auch mit einfachen Pfad angaben. gcc -o test main.c /usr/lib/libm.a .........


Edit: Du solltest bei -static aufpassen da dann der gcc die libc statisch linkt. (Programm wird größer!)

mfg manhunt
 
Zuletzt bearbeitet:

Ähnliche Themen

Anfänger Frage: Welchen Standard wählen

Bootloader sichern und wiederherstellen mit dd

verzeichniss suche funktioniert nicht

Ubuntu Problem

qt statisch linken

Zurück
Oben