FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Hard- und Softwarefragen

Linux gcc, statisch linken

Linux gcc, statisch linken 2010-07-08 13:58
Anonymer User
Ich habe mir ein kleines C-Programm geschrieben, das ich gerne auf meinem Webserver laufen lassen will. Das Problem ist, dass ich Funktionen von poppler und cairo verwende, die ich auf dem Webserver leider nicht nachinstallieren kann. Deswegen würde ich das Binary gerne statisch linken.

Das normale (dynamaisch gelinkte) Binary wird erzeugt und läuft auch einwandfrei:
cc $(pkg-config --cflags --libs poppler-glib poppler-cairo) -o pdf2png pdf2png.c
Ausgabe von ldd:
       linux-vdso.so.1 =>  (0x00007fff257ff000)         libpoppler-glib.so.5 => /usr/lib/libpoppler-glib.so.5 (0x00007fe468cac000)         libgdk-x11-2.0.so.0 => /usr/lib/libgdk-x11-2.0.so.0 (0x00007fe4689f2000)         libgdk_pixbuf-2.0.so.0 => /usr/lib/libgdk_pixbuf-2.0.so.0 (0x00007fe4687d6000)         libpangocairo-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0 (0x00007fe4685c9000)         libpango-1.0.so.0 => /usr/lib/libpango-1.0.so.0 (0x00007fe46837e000)         libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0x00007fe468137000)         libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x00007fe467f33000)         libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x00007fe467c4e000)         libpoppler.so.6 => /usr/lib/libpoppler.so.6 (0x00007fe467833000)         libcairo.so.2 => /usr/lib/libcairo.so.2 (0x00007fe4675b0000)         libc.so.6 => /lib/libc.so.6 (0x00007fe467254000)         libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00007fe466fbc000)         libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/libstdc++.so.6 (0x00007fe466cb1000)         libm.so.6 => /lib/libm.so.6 (0x00007fe466a2e000)         libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fe466817000)         libpangoft2-1.0.so.0 => /usr/lib/libpangoft2-1.0.so.0 (0x00007fe4665ed000)         libXinerama.so.1 => /usr/lib/libXinerama.so.1 (0x00007fe4663ea000)         libXi.so.6 => /usr/lib/libXi.so.6 (0x00007fe4661da000)         libXrandr.so.2 => /usr/lib/libXrandr.so.2 (0x00007fe465fd1000)         libXcursor.so.1 => /usr/lib/libXcursor.so.1 (0x00007fe465dc6000)         libXcomposite.so.1 => /usr/lib/libXcomposite.so.1 (0x00007fe465bc3000)         libXext.so.6 => /usr/lib/libXext.so.6 (0x00007fe4659b0000)         libXdamage.so.1 => /usr/lib/libXdamage.so.1 (0x00007fe4657ad000)         libXfixes.so.3 => /usr/lib/libXfixes.so.3 (0x00007fe4655a7000)         libpixman-1.so.0 => /usr/lib/libpixman-1.so.0 (0x00007fe46534c000)         libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x00007fe465117000)         libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007fe464eed000)         libglitz-glx.so.1 => /usr/lib/libglitz-glx.so.1 (0x00007fe464ce6000)         libGL.so.1 => //usr/lib64/opengl/nvidia/lib/libGL.so.1 (0x00007fe464ae7000)         libpthread.so.0 => /lib/libpthread.so.0 (0x00007fe4648cb000)         libglitz.so.1 => /usr/lib/libglitz.so.1 (0x00007fe4646a1000)         libpng12.so.0 => /usr/lib/libpng12.so.0 (0x00007fe46447b000)         libxcb-render-util.so.0 => /usr/lib/libxcb-render-util.so.0 (0x00007fe464277000)         libxcb-render.so.0 => /usr/lib/libxcb-render.so.0 (0x00007fe46406e000)         libXrender.so.1 => /usr/lib/libXrender.so.1 (0x00007fe463e64000)         libz.so.1 => /lib/libz.so.1 (0x00007fe463c4e000)         libX11.so.6 => /usr/lib/libX11.so.6 (0x00007fe463914000)         libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007fe4636f6000)         libXau.so.6 => /usr/lib/libXau.so.6 (0x00007fe4634f2000)         libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007fe4632ec000)         libgio-2.0.so.0 => /usr/lib/libgio-2.0.so.0 (0x00007fe46303e000)         libresolv.so.2 => /lib/libresolv.so.2 (0x00007fe462e27000)         libdl.so.2 => /lib/libdl.so.2 (0x00007fe462c23000)         libjpeg.so.8 => /usr/lib/libjpeg.so.8 (0x00007fe4629ea000)         libcurl.so.4 => /usr/lib/libcurl.so.4 (0x00007fe462798000)         liblcms.so.1 => /usr/lib/liblcms.so.1 (0x00007fe46255e000)         libxml2.so.2 => /usr/lib/libxml2.so.2 (0x00007fe462203000)         libpng14.so.14 => /usr/lib/libpng14.so.14 (0x00007fe461fdc000)         /lib64/ld-linux-x86-64.so.2 (0x00007fe468ee7000)         libGLcore.so.1 => //usr/lib64/opengl/nvidia/lib/libGLcore.so.1 (0x00007fe460346000)         libnvidia-tls.so.1 => //usr/lib64/opengl/nvidia/lib/libnvidia-tls.so.1 (0x00007fe468fc3000)         libldap-2.4.so.2 => /usr/lib/libldap-2.4.so.2 (0x00007fe460104000)         librt.so.1 => /lib/librt.so.1 (0x00007fe45fefb000)         libssl.so.0.9.8 => /usr/lib/libssl.so.0.9.8 (0x00007fe45fca7000)         libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8 (0x00007fe45f91c000)         libgmp.so.3 => /usr/lib/libgmp.so.3 (0x00007fe45f6c3000)         liblber-2.4.so.2 => /usr/lib/liblber-2.4.so.2 (0x00007fe45f4b4000)

Will ich das ganze jetzt statisch linken will:

cc $(pkg-config --cflags --libs poppler-glib poppler-cairo) -static -o pdf2png pdf2png.c
Gibts folgenden Fehler:

/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lpoppler-glib /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lgdk-x11-2.0 /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lgdk_pixbuf-2.0 /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lpangocairo-1.0 /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lpango-1.0 /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lpoppler

Was ich nicht verstehe: Wieso funktioniert das dynamische linken (und zur Laufzeit das laden der richtigen Libs), aber das statische Linken nicht?

RE: Linux gcc, statisch linken 2010-07-08 14:02
UncleOwen
Vermutlich, weil Du nur die dynamischen libraries (.so) und nicht die statischen (.a) installiert hast.

RE: Linux gcc, statisch linken 2010-07-08 15:12
Wulf
poppler$ ./configure –prefix=$HOME/poppler && make && make install
LD_LIBRARY_PATH=$HOME/poppler/lib pdf2png foo.pdf bar.png

oder so ähnlich.
man ld.so