74 votes

Comment compiler un fichier .c avec des inclusions OpenSSL ?

J'essaie de compiler un petit fichier .c qui contient les includes suivants :

#include <openssl/ssl.h>
#include <openssl/rsa.h>
#include <openssl/x509.h>
#include <openssl/evp.h>

Dans le même dossier où j'ai le fichier .c, j'ai un /openssl avec tous ces fichiers (et plus), également dans le gestionnaire de paquets synaptic je vois OpenSSL installé, j'essaie de compiler avec cela :

gcc -o Opentest Opentest.c -lcrypto

mais je reçois toujours les erreurs :

error: openssl/ssl.h: No such file or directory
error: openssl/rsa.h: No such file or directory
error: openssl/x509.h: No such file or directory
error: openssl/evp.h: No such file or directory

Le fichier que je veux compiler est seulement un fichier .c, il n'a pas de Makefile ou de ./configure.

J'ai déjà essayé :

env CFLAGS=-I/path/to/openssl/

et j'ai essayé de compiler à nouveau mais j'obtiens les mêmes erreurs.

Que dois-je faire pour compiler avec les inclusions OpenSSL ?

0 votes

Voir aussi Comment compiler openssl avec rpath relatif ? et Construire OpenSSL avec RPATH ? Il garantit que vous obtenez les bibliothèques attendues au moment de l'exécution.

113voto

caf Points 114951

Vos chemins d'inclusion indiquent que vous devriez compiler contre le fichier du système Installation d'OpenSSL. Vous ne devriez pas avoir le .h dans votre répertoire de paquets - il devrait les récupérer à partir des fichiers suivants /usr/include/openssl .

Le paquetage OpenSSL ordinaire ( libssl ) ne comprend pas le .h vous devez également installer le paquet de développement. Celui-ci s'appelle libssl-dev sur Debian, Ubuntu et autres distributions similaires, et libssl-devel sur CentOS, Fedora, Red Hat et similaires.

0 votes

@jahmax : Pas d'inquiétude. Vous constaterez que la plupart des paquets de bibliothÃ?ques dans les distros basées sur Debian ont une Â" Â". *-dev que vous devrez compiler contre la bibliothèque (et souvent un *-dbg contenant les symboles de débogage de la bibliothèque).

2 votes

C'est ça. libssl-dev a fait l'affaire pour construire osslsigncode-1.5.2 sur Ubuntu.

3 votes

Comment installer libssl-dev dans wondows7 ?

12voto

Borealid Points 35075

Utilisez le -I à gcc correctement.

gcc -I/path/to/openssl/ -o Opentest -lcrypto Opentest.c

Le site -I doit pointer vers le répertoire contenant le openssl dossier.

2 votes

Gcc -I/home/username/Programming/openssl/ -o Opentest -lcrypto Opentest.c il me donne les mêmes erreurs :(

2 votes

Pour approfondir votre réponse, si le dossier openssl est /path/to/openssl/ alors l'option doit être -I/path/to/ @jahmax. donc vous voulez /home/username/Programming/

0 votes

@Earlz : Merci, j'ai essayé de dire ça avec la dernière ligne explicite mais ça a dû être raté.

10voto

user2317002 Points 21

Utilisez l'extrait ci-dessous comme solution au défi cité ;

yum install openssl
yum install openssl-devel

Testé et prouvé efficace sur CentOS version 5.4 avec keepalived version 1.2.7.

4voto

Praveen S Points 7978

A partir du fichier openssl.pc

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: OpenSSL
Description: Secure Sockets Layer and cryptography libraries and tools
Version: 0.9.8g
Requires:
Libs: -L${libdir} -lssl -lcrypto
Libs.private: -ldl -Wl,-Bsymbolic-functions -lz
Cflags: -I${includedir}

Vous pouvez y noter le chemin du répertoire Include et le chemin des Libs. Maintenant votre préfixe pour les fichiers include est /home/username/Programming . Par conséquent, l'option de votre fichier d'inclusion devrait être -I//home/username/Programming .

(Oui, je l'ai obtenu à partir des commentaires ci-dessus)

C'est juste pour supprimer les journaux concernant les en-têtes. Vous pouvez tout aussi bien fournir -L<Lib path> pour la liaison avec le -lcrypto bibliothèque.

0 votes

J'ai toujours des erreurs dans tous les includes utilisés par ssl.h, pourquoi gcc ne peut pas les trouver ?

4voto

Jonathan Leffler Points 299946

Si les en-têtes OpenSSL sont dans le fichier openssl sous-répertoire du répertoire courant, utiliser :

gcc -I. -o Opentest Opentest.c -lcrypto

Le pré-processeur cherche à créer un nom tel que " ./openssl/ssl.h " de la " . " dans le -I et le nom spécifié entre crochets. Si vous aviez spécifié les noms entre guillemets doubles ( #include "openssl/ssl.h" ), vous n'auriez peut-être jamais eu besoin de poser la question ; le compilateur sous Unix recherche généralement automatiquement les en-têtes entre guillemets dans le répertoire courant, mais il ne le fait pas pour les en-têtes entre crochets ( #include <openssl/ssl.h> ). Il s'agit d'un comportement défini par la mise en œuvre.

Vous ne dites pas où se trouvent les librairies OpenSSL - vous devrez peut-être ajouter une option et un argument appropriés pour le spécifier, comme ' -L /opt/openssl/lib '.

0 votes

J'ai essayé -L/usr/lib mais j'ai toujours des erreurs dans tous les includes de ssl.h, pourquoi gcc ne les trouve pas ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X