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?
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.
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
.
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.
À 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.
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
'.
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.
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.