PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Statisch gelinktes Programm erstellen



jay-t
11-10-2008, 17:35
Ich möchte mein Programm statisch linken, also damit es auch auf einem
Linux läuft dem die benötigten Bibliotheken fehlen.



gcc -o nanogfx -march=athlon -ffast-math -fomit-frame-pointer -O0 -I/usr/include/SDL -I/usr/local/include/SDL main.c socket.c gadgets.c mem.c string.c -Wl,-Bstatic -lSDLmain -lSDL -lSDL_net -lSDL_gfx -lSDL_ttf -lSDL_image
/usr/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status


So wie ich das sehe wird "libgcc_s" dafür benötigt? Wo kann ich die finden?

undefined
11-10-2008, 20:10
Du hast sowohl static als auch shared Bibliothek mit eingbunden. Gebe am besten die Kompletten Pfade zu den Statischen Bibliotheken an. -lgcc_s gibt es nur als shared daher auch das _s ;) Diese Bibliothek wird Automatisch vom gcc Compiler eingebunden. Du kannst das aber auch mit der gcc option "-static" oder "-static-libgcc" erzwingen.

jay-t
17-10-2008, 14:13
Ok, dann geht es. Aber das Programm hat immer noch die gleiche Größe.
Wenn die SDL Bibliotheken gelinkt würden, dann müßte es doch größer werden.

Die Sollen ja alle mit dazu gelinkt werden. Was muß ich da machen?

undefined
17-10-2008, 14:20
Du stellst dir eher die Frage ob dein Programm jetzt auch wirklich rein statisch ist. ldd aus den glibc Paket gibt aufschluss darüber wie dein Programm übersetzt wurde.

panzi
18-10-2008, 01:38
Du hast sowohl static als auch shared Bibliothek mit eingbunden. Gebe am besten die Kompletten Pfade zu den Statischen Bibliotheken an. -lgcc_s gibt es nur als shared daher auch das _s ;) Diese Bibliothek wird Automatisch vom gcc Compiler eingebunden. Du kannst das aber auch mit der gcc option "-static" oder "-static-libgcc" erzwingen.
So ala: _s steht für shared, das weiß doch jeder. Warum sollte _s für static stehn? *g*

undefined
18-10-2008, 16:59
Hat hier einer behauptet das es jeder wissen muss?Extra für dich das ist im übrigen schon seit 3.1 der fall. http://www.techfak.uni-bielefeld.de/rechner/bulletin/volume29/1.html

jay-t
19-10-2008, 14:10
Hier ist die Ausgabe von ldd, die Bibliotheken sind nicht im Programm
eingebunden.



ldd nanogfx
linux-gate.so.1 => (0xb7f13000)
libSDL-1.2.so.0 => /usr/lib/libSDL-1.2.so.0 (0xb7e4b000)
libSDL_net-1.2.so.0 => /usr/lib/libSDL_net-1.2.so.0 (0xb7e47000)
libSDL_gfx.so.4 => /usr/lib/libSDL_gfx.so.4 (0xb7e34000)
libSDL_ttf-2.0.so.0 => /usr/lib/libSDL_ttf-2.0.so.0 (0xb7e2f000)
libSDL_image-1.2.so.0 => /usr/lib/libSDL_image-1.2.so.0 (0xb7e14000)
libc.so.6 => /lib/libc.so.6 (0xb7cd6000)
libasound.so.2 => /usr/lib/libasound.so.2 (0xb7c13000)
libm.so.6 => /lib/libm.so.6 (0xb7bed000)
libdl.so.2 => /lib/libdl.so.2 (0xb7be9000)
libdirectfb-1.0.so.0 => /usr/lib/libdirectfb-1.0.so.0 (0xb7b82000)
libfusion-1.0.so.0 => /usr/lib/libfusion-1.0.so.0 (0xb7b7a000)
libdirect-1.0.so.0 => /usr/lib/libdirect-1.0.so.0 (0xb7b66000)
libvga.so.1 => /usr/lib/libvga.so.1 (0xb7b04000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb7aec000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0xb7a77000)
libz.so.1 => /usr/lib/libz.so.1 (0xb7a62000)
libpng12.so.0 => /usr/lib/libpng12.so.0 (0xb7a3e000)
libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0xb7a1e000)
libtiff.so.4 => /usr/lib/libtiff.so.4 (0xb79c9000)
/lib/ld-linux.so.2 (0xb7f14000)
librt.so.1 => /lib/librt.so.1 (0xb79c0000)
libx86.so.1 => /lib/libx86.so.1 (0xb79bd000)

undefined
19-10-2008, 21:59
Dein Programm wurde nicht statisch übersetzt. Was du siehst sind alles shared Bibliotheken.

panzi
20-10-2008, 13:57
Hat hier einer behauptet das es jeder wissen muss?Extra für dich das ist im übrigen schon seit 3.1 der fall. http://www.techfak.uni-bielefeld.de/rechner/bulletin/volume29/1.html

War ja net ernst gemeint. ;)
Ich mein nur, dass die Endung _s es eben nicht schafft die Unterscheidung zwischen shared und static zu machen. Die hätten _sh bzw. _st nehmen sollen.