web-dev-qa-db-de.com

Wie kompiliere ich eine .c-Datei mit OpenSSL Includes?

Ich versuche, eine kleine C-Datei zu kompilieren, die Folgendes enthält:

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

In dem gleichen Ordner, in dem ich die .c-Datei habe, habe ich ein/openssl mit all diesen Dateien (und mehr), auch in Synaptic Package Manager sehe ich, dass OpenSSL installiert ist, versuche ich dies zu kompilieren:

gcc -o Opentest Opentest.c -lcrypto

aber ich bekomme immer die fehler:

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

Die Datei, die ich kompilieren möchte, ist nur eine .c-Datei, hat kein Makefile oder ./configure.

Ich habe es schon versucht:

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

und versuchte, wieder zu kompilieren, aber ich erhalte die gleichen Störungen.

Was muss ich tun, um mit openssl includes zu kompilieren?

66
jahmax

Ihre Include-Pfade zeigen an, dass Sie gegen die OpenSSL-Installation des Systems kompilieren sollten. Sie sollten die .h - Dateien nicht in Ihrem Paketverzeichnis haben - es sollte sie von /usr/include/openssl Abholen.

Das einfache OpenSSL-Paket (libssl) enthält keine .h - Dateien - Sie müssen auch das Entwicklungspaket installieren. Dies wird unter Debian, Ubuntu und ähnlichen Distributionen mit libssl-dev Und unter CentOS, Fedora, Red Hat und ähnlichen mit libssl-devel Bezeichnet.

99
caf

Verwenden Sie die -I Flagge richtig zu gcc.

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

Das -I sollte auf das Verzeichnis verweisen, das den Ordner openssl enthält.

9
Borealid

Verwenden Sie das folgende Snippet als Lösung für die angeführte Herausforderung.

yum install openssl
yum install openssl-devel

Getestet und bewährt auf CentOS Version 5.4 mit Keepalived Version 1.2.7.

6
user2317002

Aus der Datei 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}

Hier können Sie den Include-Verzeichnispfad und den Libs-Pfad notieren. Jetzt lautet Ihr Präfix für die Include-Dateien /home/username/Programming. Daher sollte Ihre Include-Datei-Option -I//home/username/Programming Sein.

(Ja, ich habe es aus den Kommentaren oben)

Dies dient nur zum Entfernen von Protokollen bezüglich der Header. Sie können auch die Option -L<Lib path> Für die Verknüpfung mit der Bibliothek -lcrypto Angeben.

4
Praveen S

Wenn sich die OpenSSL-Header im Unterverzeichnis openssl des aktuellen Verzeichnisses befinden, verwenden Sie:

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

Der Pre-Prozessor versucht, einen Namen wie "./openssl/ssl.h" von dem "." in dem -I -Option und der in spitzen Klammern angegebene Name. Wenn Sie die Namen in Anführungszeichen gesetzt hätten (#include "openssl/ssl.h"), du hättest die Frage vielleicht nie stellen müssen; Der Compiler unter Unix sucht normalerweise automatisch im aktuellen Verzeichnis nach Überschriften in doppelten Anführungszeichen, nicht jedoch nach Überschriften in spitzen Klammern (#include <openssl/ssl.h>). Es ist implementierungsdefiniertes Verhalten.

Sie sagen nicht, wo sich die OpenSSL-Bibliotheken befinden - möglicherweise müssen Sie eine entsprechende Option und ein Argument hinzufügen, um dies anzugeben, z. B. '-L /opt/openssl/lib '.

4

Sie müssen den Bibliothekspfad angeben (-L/usr/local/lib /)

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

Für mich geht das.

4
Jeff Pal

Für diesen gcc-Fehler sollten Sie auf das gcc-Dokument über den Suchpfad verweisen.

Zusamenfassend:

1) Wenn Sie spitze Klammern (<>) mit #include verwenden, durchsucht gcc die Header-Datei zunächst über den Systempfad /usr/local/include . und /usr/include usw.

2) Der mit der Befehlszeilenoption -L dir angegebene Pfad wird vor den Standardverzeichnissen durchsucht.

3) Wenn Sie Anführungszeichen ("") mit #include als #include "file" verwenden, wird zuerst das Verzeichnis durchsucht, das die aktuelle Datei enthält.

daher lautet die Antwort auf Ihre Frage wie folgt:

1) Wenn Sie Header-Dateien in Ihrem Quellcode-Ordner verwenden möchten, ersetzen Sie <> durch "" in der Anweisung #include.

2) Wenn Sie die Befehlszeilenoption -I verwenden möchten, fügen Sie sie Ihrer Kompilierungsbefehlszeile hinzu. (Wenn Sie CFLAGS in Umgebungsvariablen festlegen, wird nicht automatisch darauf verwiesen.)

3) Über die Paketkonfiguration (openssl.pc) denke ich nicht, dass darauf verwiesen wird, ohne dass dies in der Build-Konfiguration explizit deklariert wurde.

1
gzh