Dynamisches und statisches Linken



  • Hey Leute,
    und zwar arbeite ich mit Code Blocks, hab das aber mit den dynamischen und statischen Libaries noch nicht so verstanden.
    Binde ich jetzt zum Beispiel iostream oder so ein, dann linkt er es ja dynamisch, heißt also für mich, will ich mein prog auf nem anderen pc starten muss die lib vorhanden sein.
    geh ich jetzt auf project build options und mach bei linken link libaries diese lib rein ist sie statisch gelinkt und wird nicht mehr auf nem anderen pc benötigt, dafür ist die exe größer???

    so jetzt habe ich ein programm mit selbst geschrieben headerdateien, wie werden die gelinkt, dynamisch oder statisch?

    also benötige ich auf nem anderen pc meine header dateien oder nicht?

    hoffe ihr könnt mir helfen;-)



  • fr33g schrieb:

    ...

    Auch wenn ich von einen Trollversuch ausgehe:

    fr33g schrieb:

    Binde ich jetzt zum Beispiel iostream oder so ein linkt er es ja dynamisch, heißt also für ich mein prog auf nem anderen pc aus muss die lib vorhanden sein...
    ...statisch gelinkt ...wird nicht mehr auf nem anderen pc benötigt, dafür ist die exe größer???

    Wenn du statisch linkst, wird die gesamte nötige Bibliothek in deine Anwendung kopiert (Daher größer), wenn du dynamisch linkst, benötigt man diese Bibliothek ja weiterhin (aber nur einmal, unabhängig davon wieviele Programme diesen benötigen).

    fr33g schrieb:

    so jetzt habe ich ein programm mit selbst geschrieben headerdateien, wie werden die gelinkt, dynamisch oder statisch?

    Grundsätzlich wird Code immer in die Anwendung gelinkt (entspricht im wesentlichen dem statischen Linken). Nur erfordert die Standardbibliothek nicht nur Code sondern auch die C++ Runtime, die als Bibliothek vorliegt, und entweder statisch oder dynamisch hinzugefügt wird.



  • Danke erst mal.

    Also wenn ich dass jetzt richtig verstanden habe heißt dass ja, dass wenn ich jetzt in meinem Programm zum Beispiel iostream einbinde, linkt er es erst mal dynamisch, das heißt auf einem anderen pc muss die lib auch vorhanden sein.
    link ich sie jedoch statisch ins prog rein, kann ich die exe einfach so auf nem anderen pc starten ohne dass auf diesem pc die lib vorhanden ist???
    Hoffe dass habe ich richtig verstanden.

    So und nun schreib ich mir ein Programm mit einer Headerdatei in der die Klasse Beispiel deklariert ist. So nun linkt er sie automatisch statisch? Heißt ich kann mein Programm auch an nem anderen Pc starten ohne dass auf diesem meine KlasseBeispiel.h sein muss???

    Wie kann ich jetzt zum Beispiel meine KlasseBeispiel.h dynamisch linken???

    Und, also ich hoffe du kennst dich vll ein bisschen mit code blocks aus, dort kann man als neues Projekt, ja ganz normal zum beispiel console application auswählen, jetzt kann man aber auch static link libarie wählen oder dynamic link libarie.

    heißt ich kann ein neues projekt machen, zum beispiel static link libarie, schreibe dort meine Klasse Beispiel rein, geh in mein Programm und füge dort die static link libarie Klasse Beispiel ein. und sie ist statisch gelinkt.
    Ist sie ja aber eg auch ohne diesen schritt da er es ja automatisch macht oder???
    so und wie könnt ich die klasse jetzt dynamisch machen und mit dem prorgramm verlinken???

    hoffe du verstehst was ich mein:D:D

    danke schonmal



  • fr33g schrieb:

    so jetzt habe ich ein programm mit selbst geschrieben headerdateien, wie werden die gelinkt, dynamisch oder statisch?

    Headerdateien werden gar nicht gelinkt! Der Preprozessor ersetzt #include-Anweisungen einfach durch den Inhalt des Headers. Mit Linken hat das nichts zu tun. Daher reicht ja auch ein #include nicht aus, um eine Library einzubinden, sondern man muss dem Linker noch genau sagen, welche Library er einbinden muss. Die Header brauchst du also in keinem Fall mehr, nachdem du die Anwendung kompiliert hast.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ok, erst mal danke.

    Wenn ich in meinem programm jetzt iostream einbinde, muss ich entweder die c++ standard lib statisch linken oder dynamisch linken, dann jedoch muss die dll auf dem pc auch drauf sein wo ich mein programm starte?

    so wenn ich ne klasse hab die ich oft brauch kann ich die ja in ne static lib packen und in meinem programm statisch linken, dann is die exe halt größer aber programm läuft überall.

    wenn ich die klasse in ne dynamische lib packe, muss ich dem linker sagen dass er diese datei beim programmstart bzw wenn sie benötigt wird, linkt. dann muss die dll jedoch auf dem pc vorhanden sein wo ich das programm starte.
    wie kann ich dem linker das sagen dass er sie linkt?
    und in ner dll muss ich doch explizit kennzeichnen welche funktionen exportiert werden sollen und im programm selber welche von der dll sind?

    danke schonmal



  • fr33g schrieb:

    Wenn ich in meinem programm jetzt iostream einbinde, muss ich entweder die c++ standard lib statisch linken oder dynamisch linken, dann jedoch muss die dll auf dem pc auch drauf sein wo ich mein programm starte?

    Es muss die C++ Runtime vorhanden sein (in der Regel ist sie das auch durch diverse Programme, aber ansonsten kann man die bei MS auch herunterladen. Beispielsweise diese für VS 2008).

    Anfängern wird in der Regel die statische Variante nahegelegt. Bei größeren Projekten, die selbst wieder aus diversen Bibliotheken bestehen würde ich aber dynamisch linken (Sonst muss in jeder Bibliothek, und in der exe diese statisch gelinkt sein - was ich zumindest als unsinnig ansehe).



  • Also ich habe das mit dem dynamischen und statischem linken mittlerweile schon verstanden, hab mich noch im Internet schlaut gemacht=)
    Blos eine Frage bleibt mir offen, und zwar brauche ich ja wenn ich iostream einbinde oder so generell die c++ standard bibliothek.
    Diese wird ja soweit ich weiß im normalfall dynamisch gelinkt, wo sehe ich jedoch die anweisung dass diese dynamisch gelinkt wird?
    oder ist das beim linker standardmäßig eingestellt?
    Denn ich geb das ja nirgends explizit an.

    Danke schonmal=)


Anmelden zum Antworten