web-dev-qa-db-fra.com

Comment compiler un fichier .c avec OpenSSL inclus?

J'essaie de compiler un petit fichier .c contenant les éléments suivants:

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

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

gcc -o Opentest Opentest.c -lcrypto

mais j'obtiens 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 n’est qu’un fichier .c, n’a pas de Makefile ou ./configure.

J'ai déjà essayé:

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

et essayé de compiler à nouveau mais je reçois les mêmes erreurs.

Que dois-je faire pour compiler avec openssl inclut?

66
jahmax

Vos chemins d’inclusion indiquent que vous devez compiler avec l’installation de système OpenSSL. Vous ne devriez pas avoir le .h fichiers dans votre répertoire de paquets - il devrait les récupérer à partir de /usr/include/openssl.

Le paquet OpenSSL en clair (libssl) n’inclut pas le .h fichiers - vous devez également installer le package de développement. Ceci est nommé libssl-dev sur les distributions Debian, Ubuntu et similaires, et libssl-devel sur CentOS, Fedora, Red Hat et autres.

99
caf

Utilisez le -I drapeau à gcc correctement.

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

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

9
Borealid

Utilisez l'extrait de code ci-dessous comme solution au problème cité.

yum install openssl
yum install openssl-devel

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

6
user2317002

À 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 noter le chemin du répertoire d’inclusion et le chemin de la bibliothèque. Maintenant, votre préfixe pour les fichiers inclus est /home/username/Programming. Par conséquent, votre option de fichier à inclure devrait être -I//home/username/Programming.

(Oui je l'ai eu des commentaires ci-dessus)

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

4
Praveen S

Si les en-têtes OpenSSL se trouvent dans le sous-répertoire openssl du répertoire actuel, utilisez:

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

Le pré-processeur cherche à créer un nom tel que "./openssl/ssl.h" du "." dans le -I option et le nom spécifié entre crochets. Si vous aviez spécifié les noms entre guillemets (#include "openssl/ssl.h"), vous n’auriez peut-être jamais eu besoin de poser la question; généralement, le compilateur sous Unix recherche automatiquement les en-têtes placés entre guillemets dans le répertoire courant, mais pas les en-têtes placés entre crochets (#include <openssl/ssl.h>). C'est un comportement défini par l'implémentation.

Vous ne dites pas où sont les bibliothèques OpenSSL - vous devrez peut-être ajouter une option et un argument appropriés pour le spécifier, tels que '-L /opt/openssl/lib '.

4
Jonathan Leffler

Vous devez inclure le chemin de la bibliothèque (-L/usr/local/lib /)

gcc -o Opentest Opentest.c -L/usr/local/lib/ -lssl -lcrypto

Ça marche pour moi.

4
Jeff Pal

Pour cette erreur gcc, vous devez faire référence à document gcc relatif au chemin de recherche .

En bref:

1) Si vous utilisez des crochets (<>) avec #include, gcc recherchera d’abord le fichier d’en-tête dans le chemin du système, tel que /usr/local/include et /usr/include , etc.

2) Le chemin spécifié par l'option de ligne de commande -L dir sera recherché avant les répertoires par défaut.

3) Si vous utilisez des guillemets ("") avec #include en tant que #include "fichier", le répertoire contenant le fichier actuel sera d'abord recherché.

alors, la réponse à votre question est la suivante:

1) Si vous souhaitez utiliser des fichiers d’en-tête dans votre dossier de code source, remplacez <> par "" dans la directive #include.

2) si vous souhaitez utiliser l'option de ligne de commande -I, ajoutez-la à votre ligne de commande de compilation (si CFLAGS est défini dans les variables d'environnement, il ne sera pas référencé automatiquement).

3) À propos de la configuration du paquet (openssl.pc), je ne pense pas qu'il sera référencé sans avoir été explicitement déclaré dans la configuration de la construction.

1
gzh