2012-06-12 32 views
5

Ho incluso i seguenti file di intestazione in un codice C usando le librerie openssl.Errore di compilazione Openssl

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 
#include <string.h> 
#include <time.h> 
#ifdef __VMS 
#include <in.h> 
#include <inet.h> 
#else 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#endif 
#include <openssl/crypto.h> 
#include <openssl/ssl.h> 
#include <openssl/err.h> 

Poi ho compilato il programma utilizzando gcc -o openssl -lssl -lcrypt openssl.c Nel mio ufficio questo codice compilato ed eseguito bene, ma nel mio sistema casa (entrambi sono debian linux- 6 in ufficio e Ubuntu 12.04 in casa), ha dato il seguente errore :

/tmp/ccZcmLk4.o: In function `main': 
server.c:(.text+0x3d): undefined reference to `SSL_library_init' 
server.c:(.text+0x42): undefined reference to `SSL_load_error_strings' 
server.c:(.text+0x47): undefined reference to `SSLv3_method' 
server.c:(.text+0x57): undefined reference to `SSL_CTX_new' 
server.c:(.text+0x6f): undefined reference to `ERR_print_errors_fp' 
server.c:(.text+0x97): undefined reference to `SSL_CTX_use_certificate_file' 
server.c:(.text+0xa8): undefined reference to `ERR_print_errors_fp' 
server.c:(.text+0xd0): undefined reference to `SSL_CTX_use_PrivateKey_file' 
server.c:(.text+0xe1): undefined reference to `ERR_print_errors_fp' 
server.c:(.text+0xf9): undefined reference to `SSL_CTX_check_private_key' 
server.c:(.text+0x154): undefined reference to `SSL_CTX_load_verify_locations' 
server.c:(.text+0x165): undefined reference to `ERR_print_errors_fp' 
server.c:(.text+0x18d): undefined reference to `SSL_CTX_set_verify' 
server.c:(.text+0x1a1): undefined reference to `SSL_CTX_set_verify_depth' 
server.c:(.text+0x397): undefined reference to `SSL_new' 
server.c:(.text+0x3c2): undefined reference to `SSL_set_fd' 
server.c:(.text+0x3ce): undefined reference to `SSL_accept' 
server.c:(.text+0x3e6): undefined reference to `ERR_print_errors_fp' 
server.c:(.text+0x3fe): undefined reference to `SSL_get_current_cipher' 
server.c:(.text+0x406): undefined reference to `SSL_CIPHER_get_name' 
server.c:(.text+0x42e): undefined reference to `SSL_get_peer_certificate' 
server.c:(.text+0x455): undefined reference to `X509_get_subject_name' 
server.c:(.text+0x46d): undefined reference to `X509_NAME_oneline' 
server.c:(.text+0x4b1): undefined reference to `X509_get_issuer_name' 
server.c:(.text+0x4c9): undefined reference to `X509_NAME_oneline' 
server.c:(.text+0x50d): undefined reference to `X509_free' 
server.c:(.text+0x593): undefined reference to `SSL_write' 
server.c:(.text+0x5ab): undefined reference to `ERR_print_errors_fp' 
server.c:(.text+0x5d3): undefined reference to `SSL_read' 
server.c:(.text+0x5eb): undefined reference to `ERR_print_errors_fp' 
collect2: ld returned 1 exit status 

Comprendo che ciò è dovuto all'assenza di determinate librerie nel mio PC di casa. Ma qualcuno può dirmi quali librerie ho bisogno di installare per questo? Grazie in anticipo.

risposta

17

Mettere le librerie dopo che il file di origine:

gcc -o openssl openssl.c -lssl -lcrypt 

See: http://www.network-theory.co.uk/docs/gccintro/gccintro_18.html

+0

Beh, che ha funzionato. Ma ha restituito un avvertimento che non ho ricevuto in ufficio. 'server.c: nella funzione 'main': server.c: 55: 7: warning: assegnazione ignora qualificatore 'const' dal puntatore tipo di target [abilitato di default]' Ho paura di dover incollare l'intero codice per mostrarti dove si trova il problema Ma certamente non era in ufficio. –

+0

@Hari Stai utilizzando versioni di compilatori diverse, sì? Regolare i flag durante la compilazione per armonizzare gli avvertimenti o abituarsi a diversi output del compilatore. Preferibilmente dovresti usare la stessa versione del compilatore in entrambe le posizioni. – HonkyTonk

+3

Ho dovuto eseguire '-lssl -lcrypto' (notare la 'o'!) Per evitare un misterioso 'riferimento non definito al simbolo PEM_read_bio_DHparams' –

1

messo il nome del file prima opzione -l