2013-08-12 6 views
7

Ich schrieb einfache Anwendungen mit Openssl in C und C++. Ich kompiliere sie so:Statische Link-App mit Openssl C/C++ [x86_x64]

gcc openssltest.c -o openssltest -lcrypto 
g++ openssltest.cpp -o openssltest -lcrypto 

Und alles ist ok aber nur, wenn Sie Openssl installiert haben.

Ich möchte es kompilieren, dass ich sie auf OS ausführen kann, wo es kein installiertes Openssl (linux-like OS) gibt. Ich versuchte dies:

gcc -c openssltest.c -lcrypto -static 
gcc openssltest.o -o openssltest -lcrypto -static 

und gleiche gilt für C++:

g++ -c openssltest.cpp -lcrypto -static 
g++ openssltest.o -o openssltest -lcrypto -static 

Aber diese Fehler haben:

/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup': 
(.text+0x19): undefined reference to `dlopen' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup': 
(.text+0x2c): undefined reference to `dlsym' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup': 
(.text+0x37): undefined reference to `dlclose' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func': 
(.text+0x354): undefined reference to `dlsym' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func': 
(.text+0x3fb): undefined reference to `dlerror' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_var': 
(.text+0x474): undefined reference to `dlsym' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_var': 
(.text+0x52e): undefined reference to `dlerror' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load': 
(.text+0x5a2): undefined reference to `dlopen' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load': 
(.text+0x60b): undefined reference to `dlclose' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load': 
(.text+0x638): undefined reference to `dlerror' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_pathbyaddr': 
(.text+0x6cd): undefined reference to `dladdr' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_pathbyaddr': 
(.text+0x731): undefined reference to `dlerror' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_unload': 
(.text+0x78a): undefined reference to `dlclose' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_free': 
(.text+0x4d): undefined reference to `inflateEnd' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_free': 
(.text+0x6b): undefined reference to `deflateEnd' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_ctrl': 
(.text+0x284): undefined reference to `deflate' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_ctrl': 
(.text+0x342): undefined reference to `zError' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_expand_block': 
(.text+0x411): undefined reference to `inflate' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_compress_block': 
(.text+0x4ca): undefined reference to `deflate' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_finish': 
(.text+0x51f): undefined reference to `inflateEnd' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_finish': 
(.text+0x528): undefined reference to `deflateEnd' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_init': 
(.text+0x5d7): undefined reference to `inflateInit_' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_init': 
(.text+0x659): undefined reference to `deflateInit_' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_read': 
(.text+0x893): undefined reference to `inflate' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_read': 
(.text+0x90d): undefined reference to `zError' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_read': 
(.text+0x97c): undefined reference to `inflateInit_' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_write': 
(.text+0xa6f): undefined reference to `deflate' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_write': 
(.text+0xaec): undefined reference to `zError' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_write': 
(.text+0xb7e): undefined reference to `deflateInit_' 
collect2: error: ld returned 1 exit status 

Wie kann ich das machen? Ich erinnere mich, dass ich das vor einer Weile gemacht habe, aber jetzt, ähm, habe ich vergessen, wie es geht. Im Ubuntu 13.04 x64 - kann es ein Problem sein?

+0

hinzufügen versuchen '-ldl lz' – billz

+0

@billz: 'gcc -static -o openssltest openssltest.c -ldl lz -lcrypto' gibt denselben Fehler, die ich – yak

+1

-ldl lz geschrieben nach -lcrypto – billz

Antwort

0

Ein Hotfix: versuchen Sie auch, in libdl statisch zu verknüpfen.

Wenn dies nicht funktioniert, IMHO Ihre libcrypto.a ist schlecht kompiliert.

-2

Ich hatte das gleiche Problem wie Sie. Hier ist der Befehl, der es für mich gelöst:

gcc yourfile.c -o yourfile -static -lcrypto -lz -ldl 

Es erzeugt diese Warnung:

/usr/lib/gcc/i686-linux-gnu/4.7/../../../i386-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup': (.text+0x1b): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 

aber die ausführbare Datei funktioniert immer noch.

+0

Solange Sie die libgcc/libc-libs sind sofort auf Ihrem Zielgerät verfügbar, sicher, dass es funktioniert - aber wenn Sie nicht verloren sind. In der Tat bedeutet es, dass die Binärdatei nicht vollständig statisch ist - auch dies ist keine Lösung. – drahnr

+0

Sie sagen "sicher, dass es funktioniert" und dann enden mit "das ist keine Lösung". Wenn etwas in meinem Buch funktioniert, ist es eine Lösung. – schulwitz

+0

Weil Sie etwas ausschließen, das nicht offensichtlich ist. Nicht jedes System (besonders eingebettete) enthält nicht notwendigerweise libgcc. Beachten Sie, dass das "Sicher ist es funktioniert" Teil einer "Wenn" -Anweisung ist. – drahnr

1

Sie müssen sich darüber im Klaren sein, dass Bibliotheken als statisch verknüpfte * .a-Dateien verfügbar sein müssen. Wenn dies nicht der Fall ist, wird die Kompilierung entweder fehlschlagen oder Sie erhalten eine dynamisch verknüpfte ausführbare Datei.

Wenn dies zu viel PITA bekommt (alle Bibliotheken Abhängigkeiten müssen statisch kompiliert werden, und ihre deps zu und so weiter) verwenden so etwas wie buildroot

2

hatte ich ein ähnliches Problem eine einfache DES statisch zu kompilieren versuchen Programm mit der openssl lib. Ich benutzte "-lcrpto -lz -ldl -static-libgcc" und es funktionierte für mich. Keine Warnungen oder Fehler.

+0

es funktioniert, Danke! Können Sie einfach Ihre Antwort aktualisieren, um zu erwähnen, dass die Bestellung relevant ist. – Zskdan