PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Unresolved Symbols nur bein statischen Linken von FLTK-app...



Lin728
06-04-2003, 21:17
Grüssi!

Könnte mir jemand einen Tipp geben, an was dieses Problem liegen könnte:

Wenn ich FLTK-Code mit g++ `fltk-config --cflags --libs --ldflags" code.cpp -o test compiliere klappt alles wunderbar, und ich erhalte ein dynamisch gelinkes executable.

Wenn ich allerdings statt --ldflags --ldstaticflags übergebe, oder als Linkerparameter -static angebe bekomme ich zu tonnen unresolved symbols, von irgendeinem fl-zeugs.....

Die fltk.a oder wie die auch heißt ist ja aber da, und wenn ich mit dem parameter -static linke, sollte er ja die dynamischen Bibliotheken einfach statisch reinlinken..
Es handelt sich dabei sowieso nur um eine hello-world app....

anda_skoa
07-04-2003, 10:26
Original geschrieben von ceisserer

Die fltk.a oder wie die auch heißt ist ja aber da, und wenn ich mit dem parameter -static linke, sollte er ja die dynamischen Bibliotheken einfach statisch reinlinken..


Der Linker kann nur statische Libs statisch linken.

Wahrscheinlich ist das Problem, dass du nach der FLTK lib nicht wieder zurück auf dynamisch schaltest
-static $FLTKLIB -dynamic $ANDERELIBS

Ciao,
_

Lin728
07-04-2003, 11:24
Aber ich will doch alles außer libc.so.6 statisch linken....

anda_skoa
07-04-2003, 12:35
Ah, sehr unüblich.

Normalerweise werden höchstens Nichtstandard libs statisch gelinkt.

Du brauchst halt von allen Libs die statische Version.

Link einmal dynamisch, mach dann ldd auf das Executable und sieh dir an, welche Libs du in der statischen Version brauchst.

Ciao,
_

Lin728
07-04-2003, 18:09
Nun, ldd gibt das aus:



ce@cc02eiss:~/Documents> ldd flt
libfltk.so.1.1 => /usr/X11R6/lib/libfltk.so.1.1 (0x40015000)
libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x4009b000)
libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x400aa000)
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x40184000)
libm.so.6 => /lib/libm.so.6 (0x4023c000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x4025e000)
libc.so.6 => /lib/libc.so.6 (0x40266000)
libpng.so.3 => /usr/lib/libpng.so.3 (0x4039d000)
libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x403c9000)
libz.so.1 => /lib/libz.so.1 (0x403e8000)
libdl.so.2 => /lib/libdl.so.2 (0x403f7000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
ce@cc02eiss:~/Documents>

Also werd ich :

libfltk.so.1.1 => /usr/X11R6/lib/libfltk.so.1.1 (0x40015000)
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x40184000)
und vieleicht auch:
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x4025e000)

statisch linken.

Danke für die Tipps!!

Mfg

anda_skoa
07-04-2003, 18:13
:)
Die C++ Standardlib statisch zu linken find ich schon ein bischen krank :D

Ciao,
_

Lin728
08-04-2003, 06:32
Soweit ich wieß, klappt ein mit der alten c++-standardlib gelinktes Proggi z.B. nicht auf einer neueren Version dieser Bibliothek.
Und sobald die Bibliothek mit einer anderen Version des g++ erzeugt wurde, kann mans doch sowieso nicht mehr linken?

anda_skoa
08-04-2003, 20:17
Das stimmt nur, wenn sich die ABI ändert.

Die ABI von g++ wahr jetzt jahrelang stabil und ich bin mir sicher, die neue 3.2 ABI wird auch mehrere Jahre stabil bleiben.

Praktisch alle aktuellen Distributionen haben schon den GCC3.2, die paar Debain/stable Benutzer, die noch GCC2.9.5 benutzen, würden schon aus Prinzip kein statische gelinktes Programm ausführen :)

Außer in einer chroot Umgebung vielleicht.

Aus meiner Sicht ist es einfach Unfug, die C oder C++ Standardlibs statisch zu linken.
Die sind nun mal Standardlibs.

Statisch linken widerspricht grunsätzlich mehreren Eckpfeilern der Softwareentwicklung.
Bei spezial Libraries seh ich das eventuell noch ein, oder wenn bekannt ist, dass eine häufigvorkommende Lib eine großes Problem hat und man eine geforkte Version hat, die dieses Problem beseitigt hat.

Ciao,
_