Linux - Library (so) ohne Abhängikeiten?
-
Da ich schon lange nicht mehr C/C++ programmiert habe, hoffe ich überhaupt mal, dass ich im C++-Forum hier richtig bin.
Ich möchte gerne eine Library (.so) in meinem Code nachladen. Das ganze klappt auch schon wunderbar, nur das Problem ist, dass ich zum Erstellen von der Library auch vom Mainprogramm ein .o brauche.
Dadurch linked er mir ja das .o File in das .so mitrein. Nur die Library (so) wird nur von meinem main Programm aus geladen.
Jetzt stellt sich mir die Frage, wenn ich die Library sowieso nur von meinem Programm aus lade, müsste das doch die Abhängigkeiten selbst erfüllen und somit müsste es ja nicht in die .so rein oder?
Ich habe halt schon lange nicht mehr C/C++ gemacht, sondern Java und dort reicht es eigentlich wenn entweder eine Bibliothek eine Abhängigkeit hat oder das Hauptprogramm. Beide müssten nicht sein!
Geht das hier auch oder habe ich für C/C++ Verhältnisse falsch gedacht?Falls ja, wie kompiliere ich das ganze dann?
Jetzt kompiliere und linke ich so die .so:
g++ -Wall -fPIC -c loadpainter.cpp guipainter.cpp standardpainter.cpp
g++ -shared -Wl,-soname,libloadpainter.so.1 -o libloadpainter.so.1.0 loadpainter.o guipainter.o standardpainter.o
Und die .so sollte eigentlich nur die loadpainter beinhalten und wird vom guipainter geladen (welche den standardpainter auch beinhaltet)!
mfg
-
thE_29 schrieb:
Jetzt kompiliere und linke ich so die .so:
g++ -Wall -fPIC -c loadpainter.cpp guipainter.cpp standardpainter.cpp
g++ -shared -Wl,-soname,libloadpainter.so.1 -o libloadpainter.so.1.0 loadpainter.o guipainter.o standardpainter.o
Und die .so sollte eigentlich nur die loadpainter beinhalten und wird vom guipainter geladen (welche den standardpainter auch beinhaltet)!
Ich habe Dein Problem nicht verstanden. Was soll wo drin sein und wie soll was wo nachgeladen werden?
Wenn Du in der .so nur loadpainter.o drin haben willst, warum erwähnst Du dann noch die anderen beiden Objektdateien?
Was meinst Du mit "guipainter"? Soll das ein eigenständiges Programm sein, welches deine libloadpainter.so.1 benutzen soll?
-
Also der guipainter ist das eigenständige Programm welches auch den Standardpainter beinhaltet!
Kompiliere und linke ich so wie du meinst (und ich auch am Anfang gemacht habe) kommt das hier:
g++ -Wall -fPIC -c loadpainter.cpp
g++ -shared -Wl,-soname,libloadpainter.so.1 -o libloadpainter.so.1.0 loadpainter.oDie .o Datei erstellt er ohne Probleme! Jedoch wenn das .so generiert werden soll, kommt das hier:
loadpainter.o:loadpainter.cpp:(.text+0x67): undefined reference to
CGUIPainter::~CGUIPainter()' loadpainter.o:loadpainter.cpp:(.text+0xbb): undefined reference toCGUIPainter::~CGUIPainter()'
loadpainter.o:loadpainter.cpp:(.text+0x100): undefined reference toCGUIPainter::~CGUIPainter()' loadpainter.o:loadpainter.cpp:(.text+0x124): undefined reference toCGUIPainter::~CGUIPainter()'
loadpainter.o:loadpainter.cpp:(.text+0x174): undefined reference toCGUIPainter::~CGUIPainter()' loadpainter.o:loadpainter.cpp:(.text+0x198): more undefined references toCGUIPainter::~CGUIPainter()' follow
loadpainter.o:loadpainter.cpp:(.text_ZN11CGUIPainterC2Ev[CGUIPainter::CGUIPainter()]+0x8): undefined reference to `vtab le for CGUIPainter' loadpainter.o:loadpainter.cpp:(.rdata_ZTI12CLoadPainter[typeinfo for CLoadPainter]+0x8): undefined reference to `typein
fo for CGUIPainter'
collect2: ld returned 1 exit statusNur wenn ich IM guipainter die .so lade, dann müsste er ja dort die Referenzen/Abhängigkeiten haben. Nur wenn er es mich nicht mal linken lässt, hilft mir das nicht viel..
-
Wenn ich das richtig im Kopf habe, musst du beim Kompilieren des Programms -Wl,-E mitgeben. Das veranlasst g++, -E an den Linker zu übergeben, was den dazu veranlasst, die Symbole des Programms in eine dynamische Symboltabelle zu schreiben, wo sie beim dynamischen Linken nachher gefunden werden können. Kuck dir am besten die ld-Manpage dazu an, da steht das im Detail beschrieben (u.a. auch, wie man einschränkt, welche Symbole auf diese Weise exportiert werden sollen).
Allerdings wäre es natürlich bedeutend schöner, die Module sauber voneinander zu trennen - so kannst du die .so ja mit keinem anderen Programm benutzen.
-
Naja, die .so soll ja auch nur von diesem Programm genutzt werden, weil es ein "Interface" implementiert (was im guipainter ist) und man die GUI dadurch austauschen kann.
Somit könnte mit der .so Datei kein anderes Programm was anfangen und ist auch nur für dieses Programm gedacht

Laut der man-page sollte ja -E passen, nur wenn ich das ausführe
g++ -E -shared -Wl,-soname,libloadpainter.so.1 -o libloadpainter.so.1.0 loadpainter.o
Ausgabe:
g++: loadpainter.o: linker input file unused because linking not done
Dann exisitert halt auch keine .so

-
Nachtrag, so funktioniert wenn man es gleich unter Linux probiert.
Habs zum Testen unter Cygwin probieren wollen, aber da gehts halt nicht (ich brauchs sowieso unter nativem Linux).
Hier nochmals die 2 neuen Befehle:
g++ -Wall -fPIC -c loadpainter.cpp
g++ -shared -Wl,-E -Wl,-soname,libloadpainter.so.1 -o libloadpainter.so.1.0 loadpainter.oWenn ich schon beim Kompilieren das -Wl,-E angebe, sagt er halt er nutzt es nicht weil halt nicht gelinked wird.
Jedenfalls vielen vielen Dank
