2012-06-12 45 views
5

Tôi đã bao gồm các tệp tiêu đề sau trong mã C bằng cách sử dụng thư viện openssl.Lỗi biên dịch mở

#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> 

Sau đó, tôi biên soạn chương trình sử dụng gcc -o openssl -lssl -lcrypt openssl.c Trong văn phòng của tôi mã này biên soạn và chạy tốt nhưng trong hệ thống nhà tôi (cả hai đều là linux- debian 6 trong văn phòng và Ubuntu 12.04 ở nhà), nó đã cho các lỗi sau :

/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 

Tôi hiểu rằng điều này là do không có một số thư viện nhất định trong máy tính gia đình của tôi. Nhưng bất cứ ai có thể cho tôi biết những thư viện tôi cần phải cài đặt cho điều này? Cảm ơn trước.

Trả lời

17

Đặt các thư viện sau khi các tập tin nguồn:

gcc -o openssl openssl.c -lssl -lcrypt 

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

+0

Vâng, đó là làm việc. Nhưng nó trả lại một cảnh báo mà tôi đã không nhận được tại văn phòng. 'server.c: Trong chức năng 'chính': server.c: 55: 7: cảnh báo: phân công loại bỏ 'const' vòng loại từ loại mục tiêu con trỏ [kích hoạt theo mặc định]' Tôi sợ tôi sẽ phải dán toàn bộ mã để cho bạn biết vấn đề ở đâu. Nhưng nó chắc chắn không phải ở văn phòng. –

+0

@Hari Bạn đang sử dụng các phiên bản trình biên dịch khác nhau, phải không? Hoặc điều chỉnh các cờ trong quá trình biên dịch để hài hòa các cảnh báo hoặc làm quen với đầu ra trình biên dịch khác nhau. Tốt hơn là bạn nên sử dụng cùng một phiên bản trình biên dịch trên cả hai vị trí. – HonkyTonk

+3

Tôi đã phải thực hiện '-lssl -lcrypto' (lưu ý 'o'!) Để tránh một tham chiếu không xác định' bí mật tới ký hiệu PEM_read_bio_DHparams' –

1

đặt tên tập tin trước khi lựa chọn -l