Comment faire pour compiler .c fichier avec OpenSSL comprend?
Je suis en train de compiler un petit .fichier c qui a la liste suivante comprend:
#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 .c fichier j'ai un /openssl avec tous ces fichiers (et plus), également dans le gestionnaire de paquet synaptic je vois OpenSSL installé, je suis en train d'essayer de compiler avec ceci:
gcc -o Opentest Opentest.c -lcrypto
mais je reçois toujours des 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'une .fichier c, ne pas avoir Makefile ou ./configurer.
J'ai déjà essayé:
env CFLAGS=-I/path/to/openssl/
et essayé de compiler à nouveau, mais j'obtiens la même erreur.
Que dois-je faire pour compiler avec openssl comprend?
- Voir aussi Comment compiler openssl avec une relative rpath et Construire OpenSSL avec RPATH? Il s'assure que vous obtenez le devrait bibliothèques à l'exécution.
Vous devez vous connecter pour publier un commentaire.
Vos chemins à inclure indiquent que vous devez être la compilation contre le du système OpenSSL installation. Vous ne devriez pas avoir l'
.h
fichiers dans votre répertoire package - il faut les chercher à l'/usr/include/openssl
.La plaine paquet OpenSSL (
libssl
) ne comprend pas le.h
de fichiers, vous devez installer les paquets de développement ainsi. C'est nomméelibssl-dev
sur Debian, Ubuntu et autres distributions similaires, etlibssl-devel
sur CentOS, Fedora, Red Hat et similaires.*-dev
paquet que vous aurez besoin de compiler la bibliothèque (et souvent un*-dbg
paquet contenant les symboles de débogage pour la bibliothèque).libssl-dev
dans wondows7?Utiliser le
-I
drapeau à gcc correctement.gcc -I/path/to/openssl/-o Opentest -lcrypto Opentest.c
La
-I
doit pointer vers le répertoire contenant leopenssl
dossier./path/to/openssl/
ensuite l'option doit être-I/path/to/
@jahmax. donc, vous voulez/home/username/Programming/
openssl/*
) ne correspond pas à l'installation de OpenSSL (possible*
), alors vous pourriez avoir ce problème. La meilleure solution est de modifier votre projet pour utiliserssl.h
au lieu deopenssl/ssl.h
etc. La solution est de définir les chemins d'inclusion pour les deux/path/to/
et/path/to/openssl/
Utiliser l'extrait de code ci-dessous comme une solution pour la cité défi;
Testée et s'est avérée efficace sur CentOS version 5.4 avec keepalived version 1.2.7.
Si OpenSSL les en-têtes sont les
openssl
sous-répertoire du répertoire courant, utilisez:Le pré-processeur cherche à créer un nom tel que "
./openssl/ssl.h
" de la ".
" dans le-I
option et le nom spécifié dans les crochets. Si vous aviez donné les noms entre guillemets doubles (#include "openssl/ssl.h"
), vous pourriez ne jamais avoir besoin de poser la question; le compilateur Unix généralement des recherches pour les en-têtes entouré de guillemets doubles dans le répertoire courant automatiquement, mais il ne le fait pas pour les en-têtes placée entre crochets (#include <openssl/ssl.h>
). Elle est définie par l'implémentation du comportement.Vous ne dites pas où les bibliothèques OpenSSL êtes - vous pourriez avoir besoin d'ajouter une option appropriée et de l'argument de préciser que, comme"
-L /opt/openssl/lib
'.De la openssl.pc fichier
Vous pouvez noter que le répertoire include path et les Libs chemin à partir de ce. Maintenant, votre préfixe pour les fichiers à inclure est
/home/username/Programming
.D'où votre fichier option doit être
-I//home/username/Programming
.(Oui je l'ai eu à partir des observations ci-dessus)
C'est juste pour supprimer les journaux concernant les en-têtes. Vous pouvez ainsi fournir
-L<Lib path>
option pour faire le lien avec la-lcrypto
bibliothèque.Vous devez inclure le chemin de la bibliothèque (-L/usr/local/lib/)
gcc -o Opentest Opentest.c -L/usr/local/lib/-lssl -lcrypto
Cela fonctionne pour moi.
Pour la présente condition d'erreur, vous devriez faire référence à la gcc document sur le Chemin de Recherche.
En bref:
1) Si vous utilisez des crochets ("<>) avec #inclure, gcc recherche fichier d'en-tête d'abord à partir du système de chemin comme /usr/local/include et /usr/include, etc.
2) Le chemin d'accès spécifié par -Ldir option de ligne de commande, sera recherchée avant les répertoires par défaut.
3)Si vous utilisez des guillemets("") avec #include comme #include "fichier", le répertoire contenant le fichier actuel sera recherchée en premier lieu.
donc, la réponse à votre question est la suivante:
1) Si vous souhaitez utiliser les fichiers d'en-tête dans le code source de votre dossier, remplacer les <> avec les "" dans la directive #include.
2) si vous souhaitez utiliser -I option de ligne de commande, ajoutez-le à votre compiler en ligne de commande.(si la valeur CFLAGS dans les variables d'environnement, Il ne sera pas référencé automatiquement)
3) à Propos de package de configuration(openssl.pc), je ne pense pas qu'il sera référencé, sans explicitement déclaré dans la configuration de build.
-ldir
est faux. avec-l
, il est toujourslib
au lieu dedir
.-lssl
, il semble pourssl.dll
dans le répertoire d'installation deopenssl
? simplestcodings.blogspot.de/2010/08/...