PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [c++] statisch Linken



thewilli
17-08-2007, 09:20
Hi!

Ich entwickele momentan eine Applikation mit Kdevelop, die eine Bibliothek, in diesem Fall vmime (http://www.vmime.org) verwendet.

Diese Bibliothek möchte ich statisch mit der Applikation verlinken, so dass auf dem Zielsystem die Bibliothek nicht vorhanden sein muss.

Wie kann ich das am Besten realisiern? Gibt es da Einstellungsmöglichkeiten?


Danke!

locus vivendi
17-08-2007, 10:00
Das musst du in der Doku des Compilers nachgucken. Der GCC versteht z.B. ein Argument "-static" das ihn anweist gegen die statischen Versionen von Bibliotheken zu linken.

Vielleicht kannst du die dynamische Bibliothek ja auch einfach mitliefern und deine Anwendung z.B. über einen Wrapper (Startup-Skript) starten, welches ggf. den Suchpfad für den dynamischen Linker anpasst.

thewilli
17-08-2007, 10:15
Mir geht es hauptsächlich darum, dass ein paar Bibliotheken sehr störrisch sind, und auf meinem Server möchte ich keinen Compiler samt allen Dev Bibliotheken installieren.

Ja, ich benutze den GCC, allerdings möchte ich ja nicht alle Bibliotheken statisch linken. Weißt du, wie man das genauer spezifizieren kann? Gibt es da evt. eine KDevelop Einstellung, oder aber vielleicht eine bessere (OpenSource) IDE für die c++ Entwicklung?


Danke :)

locus vivendi
17-08-2007, 13:50
Ja, ich benutze den GCC, allerdings möchte ich ja nicht alle Bibliotheken statisch linken. Weißt du, wie man das genauer spezifizieren kann?
Wenn du einfach nur den Namen der statischen Bibliothek auf der Kommandozeile angibst sollte das gehen. "info gcc" zeigt übrigens das Texinfo Manual vom GCC an (wenn du auf einem Unix-artigen System arbeitest).


Gibt es da evt. eine KDevelop Einstellung, oder aber vielleicht eine bessere (OpenSource) IDE für die c++ Entwicklung?
Eine bessere freie IDE für C++ kenne ich nicht, und ich glaube auch nicht das es eine bessere gibt. Natürlich kommt das auch darauf an, was du unter besser verstehst. Zum Beispiel tut sich im KDevelop Entwicklerzweig sehr viel was Code-Completion und Syntax-Highlighting angeht. KDevelop hat da einen richtigen C++-Parser der die Bedeutung von viel mehr Sprachkonstrukten kennt als die üblichen Keyword basierten Syntax-Highlighting Parser. Und soweit ich weiß gibt es keine zweite freie IDE die das kann. Evtl. noch Eclipse CDT. Allerdings wurde ich mal dazu gezwungen Eclipse für Java zu verwenden, und da war sie fast unbrauchbar langsam, auf damaligen aktuellen Rechnern, so dass Eclipse möglicherweise dadurch ausscheidet.

Ich will nicht soviel schreiben; Quintessenz ist: Bleibe bei KDevelop.

Was das hinzulinken von Bibiothekn angeht: Du müsstest Rechts an der Seite in KDevelop ein Tab haben wo draufsteht "Automake Manager". Wenn du da auf "Options" oder so gehst gelangst du zu einem Fenster in dem du auch weitere Bibliotheken angeben kannst.

anda_skoa
17-08-2007, 14:14
Im Grunde musst du nur diese Blibliothek statisch kompilieren.

Wenn dann bei deiner Applikation -lvmime steht und nur die statische Version vorhanden ist, wird einfach dagegen gelinkt.

Ciao,
_

thewilli
17-08-2007, 14:50
erstmal Danke für eure Antworten :)

C++ ist für mich teilweise noch ziemliches Neuland. Progarammiert habe ich zuvor ausschließlich in Java, PHP, Pascal und Visual Basic. So bin ich momentan dabei, mich intensiv in C++ einzuarbeiten.

Also, ich habe diese VMIME Bibliothek. Da sie sehr viele Header- und Quellcodedateien enthält, konnte ich sie nicht direkt in KDevelop übernehmen. So bin ich den "normalen" (?) Weg gegangen:

./configure
make
make install


im Endeffekt sind die Headerfiles und die kompilierte Bibliothek in Form mehrerer Dateien dann nach /usr/local/vmime kopiert worden.


So, zurück in KDevelop konte ich die Bibliothek einbinden, d.h. #include <vmime/vmime.hpp> konnte aufgelöst und umgesetzt werden.
So, wenn ich mein Projekt nun kompiliere, läuft es nur, wenn vmime bereits vorhanden ist. Dem möchte ich im Endeffekt entgegen wirken.

Wie kann ich das richtig anstellen in KDE? In den Automake Manager die benutzten Headerfiles von vmime einbinden?? Muss sich am Aufruf dann etwas ändern?

@locus vivendi Kennst du ein gutes KDevelop Einführungstutorial, welches die verschiedenen Module (AUtomake Manager, etc) und Einstellungen beschreibt?


Danke!

anda_skoa
17-08-2007, 20:27
./configure
make
make install


im Endeffekt sind die Headerfiles und die kompilierte Bibliothek in Form mehrerer Dateien dann nach /usr/local/vmime kopiert worden.


Probier mal folgendes:
zuerst
make uninstall

dann kontrollieren ob die .so Dateien der Bibliothek weg sind.

Dann

./configure --disable-shared
make
make install

Dann sollte nur die statische Variante der Bibliothek vorhanden sein (.a)

Eventuell musst du dein Projekt auch nochmal durch den configure Schritt jagen, bzw. je nach dem welches Buildsystem du eben benutzt.

Ciao,
_