2012-08-17 17 views
6

Mam już dzisiaj zacząć odkrywać api openSSL dla RSA. To prosty kod:Openssl dla RSA: niezdefiniowane odniesienie do RSA_new

#include<stdio.h> 
#include<openssl/rsa.h> 
#include<openssl/engine.h> 
int main() { 
    RSA *rsa; 
    rsa = RSA_new_(); 
    RSA_free(rsa); 
    return 0; 
} 

i jestem kompilacji z

gcc -I/usr/local/ssl/include -o etc etc

ale gcc błędu powrót undefining odniesienie do RSA_new i RSA_free. Sprawdziłem nagłówek rsa.h i nie ma odniesienia do tej dwóch funkcji. co jest nie tak? mam śledzić przewodnik na stronie internetowej openssl ...

EDIT: wyjście gcc:

gcc -I/usr/local/ssl/include/-o RSA rsa.c -L/usr/local/ssl/lib -lcrypto /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): W funkcji dlfcn_globallookup': dso_dlfcn.c:(.text+0x1d): undefined reference to dlopen ' dso_dlfcn.c :(. text + 0x33): niezdefiniowane odniesienie do dlsym' dso_dlfcn.c:(.text+0x3d): undefined reference to dlclose ' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): W funkcji dlfcn_bind_func': dso_dlfcn.c:(.text+0x3b1): undefined reference to dlsym' dso_dlfcn.c :(. text + 0x490): niezdefiniowane odniesienie do dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function dlf cn_bind_var ' dso_dlfcn.c :(tekst i 0x511) nieokreślone odniesienie do dlsym' dso_dlfcn.c:(.text+0x5f0): undefined reference to dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): w funkcji dlfcn_load': dso_dlfcn.c:(.text+0x667): undefined reference to dlopen” dso_dlfcn.c: (.text + 0x6de) nieokreślone odniesienie do dlclose' dso_dlfcn.c:(.text+0x715): undefined reference to dlerror. /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o) w funkcji dlfcn_pathbyaddr': dso_dlfcn.c:(.text+0x7b1): undefined reference to dladdr ' dso_dlfcn.c :(tekst i 0x819) nieokreślone odniesienie do dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function dlfcn_unload ': dso_dlfcn.c :(tekstu + 0x87a). nieokreślonej odniesieniu do `dlclose' collect2 LD powrócił 1 exit status

+0

trzeba połączyć z biblioteką dla 'ssl'. Nie jestem pewien, jaka jest jego nazwa, ale spróbuj dodać '-lssl' do końca polecenia kompilatora. – hmjd

Odpowiedz

4

propblem jest to, że są powiązanie z libssl i używasz RSA kryptograficznych, który jest częścią libcrypto, kolejny błąd: nie ma funkcji o nazwie: RSA_new_:

[email protected]:/usr/include/openssl$ grep RSA_new * 
rsa.h:RSA * RSA_new(void); 
rsa.h:RSA * RSA_new_method(ENGINE *engine); 

więc poprawić swój kod:

rsa = RSA_new(); 

i skompilować tak:

gcc -I/usr/include/openssl/ -Wall my_rsa.c -o my_rsa -lcrypto 

EDIT: dla ostatniego błędu (funkcje DL):

gcc -I/usr/include/openssl/ -Wall my_rsa.c -o my_rsa -lcrypto -ldl 
+0

perfect. Właśnie dodałem opcję -L na końcu ścieżki plików biblioteki. Dziękuje za wszystko. – giozh

1

trzeba link do biblioteki libSSL z. Coś w rodzaju

zrobi lewy.

(Może to nie jest faktycznie -lssl ale -lopenssl, -lssl-rsa lub cokolwiek, można tego dowiedzieć wpisując

pkg-config --libs PACKAGENAME 

gdzie nazwa_pakietu jest nazwą pakietu, który zawiera libssl, coś libssl OpenSSL, libssl -dev, openssl-devel itp.)

+0

Próbuję to zrobić, ale to jeszcze nie działa! katalog/usr/local/ssl/lib/pkgconfig zawiera trzy pliki: libcrypto.pc, libssl.pc, openssl.pc. Kompiluję, ale coś poszło nie tak. Edytuję główną wiadomość z kompilacją wyjścia – giozh

+0

"... aby to zrobić" - zrobić co? –

+0

zrobić pkg-config! – giozh

2

Musisz dodać -lssl lub coś w tym stylu. "Undefined reference" jest generowany przez linker, który szuka rzeczywistej implementacji RSA_new i RSA_free. Funkcje te znajdują się gdzieś w bibliotece openssl, a dzięki -lssl podajesz linkerowi, gdzie się znajdują.

EDYCJA: jeśli wystąpiłby problem z plikiem nagłówkowym, pojawiłby się błąd "domniemana deklaracja identyfikatora RSA_new". Ale musisz włączyć pewne flagi, aby mieć tego rodzaju błędy (myślałem, -Wmissing-prototypes).

2

trzeba powiązać z biblioteką, a także:

gcc -I/usr/local/ssl/include -o etc etc.c -L/usr/local/lib -lssl 

Opcja -L mówi GCC gdzie szukać pliku biblioteki i -l (małe L) opowiada łącznika, który należy połączyć z biblioteką.

Należy zastąpić folder biblioteki i nazwę biblioteki tym, co otrzymałeś.

0

Jeśli używasz CMakeLists.txt, należy dodać tę prostą komendę:

link_libraries(ssl crypto) 
Powiązane problemy