Kleine Programmier fragen

Dieses Thema im Forum "C/C++" wurde erstellt von rdg, 13.07.2007.

  1. rdg

    rdg ???

    Dabei seit:
    12.10.2006
    Beiträge:
    357
    Zustimmungen:
    0
    Ort:
    Berlin
    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<>?
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. b00

    b00 Haudegen

    Dabei seit:
    28.03.2007
    Beiträge:
    597
    Zustimmungen:
    0
    Ort:
    /root
    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.
     
  4. #3 blue-dev, 13.07.2007
    blue-dev

    blue-dev stranger with blue eyes

    Dabei seit:
    30.06.2007
    Beiträge:
    438
    Zustimmungen:
    0
    #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.
     
  5. rdg

    rdg ???

    Dabei seit:
    12.10.2006
    Beiträge:
    357
    Zustimmungen:
    0
    Ort:
    Berlin
    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.
     
  6. #5 Mµ*e^13.5_?¿, 13.07.2007
    Mµ*e^13.5_?¿

    Mµ*e^13.5_?¿ Routinier

    Dabei seit:
    21.02.2006
    Beiträge:
    453
    Zustimmungen:
    0
    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.
     
  7. #6 manhunt, 13.07.2007
    Zuletzt bearbeitet: 13.07.2007
    manhunt

    manhunt Foren As

    Dabei seit:
    21.01.2007
    Beiträge:
    99
    Zustimmungen:
    0
    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
     
  8. #7 rdg, 13.07.2007
    Zuletzt bearbeitet: 13.07.2007
    rdg

    rdg ???

    Dabei seit:
    12.10.2006
    Beiträge:
    357
    Zustimmungen:
    0
    Ort:
    Berlin
    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?
     
  9. #8 manhunt, 13.07.2007
    Zuletzt bearbeitet: 13.07.2007
    manhunt

    manhunt Foren As

    Dabei seit:
    21.01.2007
    Beiträge:
    99
    Zustimmungen:
    0
    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
     
  10. rdg

    rdg ???

    Dabei seit:
    12.10.2006
    Beiträge:
    357
    Zustimmungen:
    0
    Ort:
    Berlin
    Alles klar

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

    gruß
    rdg
     
  11. #10 manhunt, 13.07.2007
    Zuletzt bearbeitet: 13.07.2007
    manhunt

    manhunt Foren As

    Dabei seit:
    21.01.2007
    Beiträge:
    99
    Zustimmungen:
    0
    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
     
  12. rdg

    rdg ???

    Dabei seit:
    12.10.2006
    Beiträge:
    357
    Zustimmungen:
    0
    Ort:
    Berlin
    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.
     
  13. #12 manhunt, 13.07.2007
    Zuletzt bearbeitet: 13.07.2007
    manhunt

    manhunt Foren As

    Dabei seit:
    21.01.2007
    Beiträge:
    99
    Zustimmungen:
    0
    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
     
  14. #13 rdg, 13.07.2007
    Zuletzt bearbeitet: 13.07.2007
    rdg

    rdg ???

    Dabei seit:
    12.10.2006
    Beiträge:
    357
    Zustimmungen:
    0
    Ort:
    Berlin
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. rdg

    rdg ???

    Dabei seit:
    12.10.2006
    Beiträge:
    357
    Zustimmungen:
    0
    Ort:
    Berlin
    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.
     
  17. #15 manhunt, 15.07.2007
    Zuletzt bearbeitet: 15.07.2007
    manhunt

    manhunt Foren As

    Dabei seit:
    21.01.2007
    Beiträge:
    99
    Zustimmungen:
    0
    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
     
Thema:

Kleine Programmier fragen

Die Seite wird geladen...

Kleine Programmier fragen - Ähnliche Themen

  1. Kleines Linux nur zum Programmieren?

    Kleines Linux nur zum Programmieren?: Hallo, ich suche ein kleines Linux, was auch auf betagteren System laufen soll, keinen unnötigen Ballast mitbringt, aber alles nötige hat zum...
  2. Kleine Frage (Solaris ein Cloud Betriebsystem?)

    Kleine Frage (Solaris ein Cloud Betriebsystem?): ′
  3. VoCore: Kleiner Open-Source-Platinenrechner mit OpenWrt

    VoCore: Kleiner Open-Source-Platinenrechner mit OpenWrt: VoCore ist Open Source, was Hard- und Software betrifft, kostet 20 US-Dollar und setzt beim Basteln eine Stufe tiefer an als der Raspberry Pi....
  4. Artikel: LibreOffice 5.0: Installation und kleiner Überblick

    Artikel: LibreOffice 5.0: Installation und kleiner Überblick: Es hat eine Weile gedauert, bis LibreOffice 5.0 schließlich in der finalen Version erschienen ist. Wir stellen Ihnen die neueste Version und auch...
  5. SSD auf einen (geringfügig) kleineren USB-Stick wiederherstellen

    SSD auf einen (geringfügig) kleineren USB-Stick wiederherstellen: Hallo, ich habe hier ein Ubuntu, instaliert auf einer SSD. Für einige Systemtests möchte ich das System auf einen USb-Stick klonen, der leider...