2016-11-17 1 views
2

J'ai le code suivant dans le fichier rsatest.c. J'essaie de générer une paire de clés RSA.Référence non définie à RSA_generate_key dans OpenSSL?

#include <openssl/rsa.h> 
#include <openssl/pem.h> 

int main(){ 
    RSA *rsa = RSA_generate_key((const int) 1024,(const int) 3, 0, 0); 
    return 0; 
} 

Je compile avec ce

gcc -I../include/ -L . -lcrypto -lssl rsatest.c 

et je reçois l'erreur suivante.

undefined reference to `RSA_generate_key' 

Est-ce que je lie les fichiers de la bibliothèque dans le mauvais ordre? J'ai fait le libcrypto.a et libssl.a sur Windows (64 bits), avec msys et mingw, et je cours le code sur le même système.

RSA_generate_key a été déclaré dans rsa.h. Est-ce qu'il n'est pas défini dans libcrypto.a?

EDIT:

J'ai essayé cela aussi,

gcc -I../include rsatest.c -L . -lcrypto -lssl 

et je comprends que l'éditeur de liens rechercher des définitions dans les bibliothèques allant de gauche à droite.

Cependant, je reçois de nouvelles références non définies à diverses fonctions dans

rand_win.o and c_zlib.o 

J'ai regardé en ligne et trouvé les symboles manquants dans les bibliothèques gdi32 et zlib. Donc j'ai ajouté

-lz and -lgdi32 

Le compilateur ne s'est pas plaint d'une bibliothèque manquante, donc je suppose qu'ils sont présents avec mingw. Et encore, j'ai la même sortie. J'ai aussi utilisé nm, et j'ai trouvé que les symboles n'étaient en effet pas définis dans rand_win.o et c_zlib.o.

Pourquoi l'éditeur de liens ne semble-t-il pas trouver de définitions dans ces bibliothèques?

+0

Utilisez l'outil 'nm' pour vérifier où le symbole est –

+0

Vous devriez utiliser [' RSA_generate_key_ex'] (http://www.openssl.org/docs/man1.0.2/crypto/RSA_generate_key_ex.html), pas ' RSA_generate_key'. – jww

Répondre

2

Modifiez l'ordre dans votre commande gcc. Autant que je sache, l'éditeur de liens a une liste de symboles indéfinis. Quand il traite libcrypto.a et libssl.a, il n'a rien dans la liste des symboles indéfinis, il ne fait que supprimer les bibliothèques. Ensuite, après le traitement de rsatest, il a quelque chose dans sa liste mais il ne cherche pas de symboles dans les bibliothèques déjà traitées.

+0

@Sashank ressemble-t-il à ceci: 'gcc -I ../ include/rsatest.c -L. -lcrypto -lssl -lz -lgdi32'? –

+0

Eh bien j'ai utilisé 'gcc -I ../ include/rsatest.c -lz -lgdi32 -L. -lcrypto -lssl', car lz et lgdi32 n'étaient pas présents dans le dossier où rsatest.c était. Mais votre édition fonctionne, et elle compile. Et j'ai réalisé que crypto obtient ses définitions de z et gdi, et peu importe où -L est. Donc même cela fonctionne 'gcc -I ../ include/rsatest.c -lcrypto -lssl -lz -lgdi32 -L .'. Merci! – Sashank