2010-07-30 80 views
58

Tôi cố gắng để biên dịch một file .c nhỏ có những điều sau đây bao gồm:Cách biên dịch tệp .c với OpenSSL bao gồm?

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

Trong cùng một thư mục nơi mà tôi có file .c Tôi có một/openssl với tất cả các tập tin (và nhiều hơn nữa), cũng trong quản lý gói synaptic tôi thấy OpenSSL cài đặt, tôi đang cố gắng để biên dịch với điều này:

gcc -o Opentest Opentest.c -lcrypto 

nhưng tôi luôn luôn nhận được lỗi:

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 

các tập tin Tôi muốn biên dịch chỉ là một tập tin .c, không có Makefile hoặc ./configure.

Tôi đã cố gắng:

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

và cố gắng để biên dịch một lần nữa nhưng tôi nhận được các lỗi tương tự.

Tôi nên làm gì để biên dịch với openssl bao gồm?

Trả lời

86

Đường dẫn bao gồm của bạn cho biết rằng bạn phải biên dịch theo cài đặt OpenSSL của hệ thống của hệ thống.Bạn không nên có các tệp .h trong thư mục gói của mình - nó sẽ được chọn từ /usr/include/openssl.

Gói OpenSSL đơn giản (libssl) không bao gồm các tệp .h - bạn cũng cần phải cài đặt gói phát triển. Điều này được đặt tên là libssl-dev trên Debian, Ubuntu và các bản phân phối tương tự, và libssl-devel trên CentOS, Fedora, Red Hat và tương tự.

+0

@jahmax: Không phải lo lắng. Bạn sẽ thấy rằng hầu hết các gói thư viện trong distro dựa trên Debian có một gói '* -dev' mà bạn sẽ cần phải biên dịch đối với thư viện (và thường là một gói' * -dbg' chứa các ký hiệu gỡ lỗi cho thư viện). – caf

+1

Bạn đã thực hiện ngày của tôi ;-) –

+2

Ngay trên. libssl-dev thực hiện thủ thuật xây dựng osslsigncode-1.5.2 trên Ubuntu. – karmakaze

9

Sử dụng cờ -I để gcc đúng cách.

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

Các -I phải trỏ đến thư mục chứa các thư mục openssl.

+2

gcc -I/home/tên người dùng/Lập trình/openssl/-o Opentest -lcrypto Opentest.c nó mang lại cho tôi các lỗi tương tự: ( – jahmax

+1

Để xây dựng câu trả lời của bạn nếu thư mục openssl là '/ path/to/openssl/'thì tùy chọn cần phải là' -I/path/to/'@jahmax. vì vậy bạn muốn'/home/username/Programming/' – Earlz

+0

@Earlz: Cảm ơn, tôi đã cố gắng nói rằng với dòng cuối cùng rõ ràng nhưng nó phải – Borealid

4

Nếu các tiêu đề OpenSSL đang trong openssl thư mục con của thư mục hiện tại, sử dụng:

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

The pre-processor trông để tạo ra một tên như "./openssl/ssl.h" từ "." trong -I tùy chọn và tên được chỉ định trong dấu ngoặc nhọn. Nếu bạn đã chỉ định tên trong dấu ngoặc kép (#include "openssl/ssl.h"), bạn có thể không bao giờ cần thiết để đặt câu hỏi; trình biên dịch trên Unix thường tìm kiếm các tiêu đề được đính kèm trong dấu ngoặc kép trong thư mục hiện tại tự động, nhưng nó không làm như vậy cho các tiêu đề được bao trong dấu ngoặc nhọn (#include <openssl/ssl.h>). Đó là hành vi được xác định thực hiện.

Bạn không nói thư viện OpenSSL ở đâu - bạn có thể cần thêm tùy chọn và đối số thích hợp để chỉ định, chẳng hạn như '-L /opt/openssl/lib'.

+0

tôi đã thử -L/usr/lib nhưng tôi vẫn gặp lỗi trong tất cả các phần tử bao gồm từ ssl.h, tại sao gcc không thể tìm thấy chúng? – jahmax

4

Từ file 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} 

Bạn có thể lưu ý Bao gồm đường dẫn thư mục và đường dẫn Libs từ này. Bây giờ tiền tố của bạn cho các tệp bao gồm là /home/username/Programming. Do đó, tùy chọn tệp bao gồm của bạn phải là -I//home/username/Programming.

(Có tôi đã nhận nó từ các ý kiến ​​ở trên)

Đây chỉ là để xóa nhật ký về tiêu đề. Bạn cũng có thể cung cấp tùy chọn -L<Lib path> để liên kết với thư viện -lcrypto.

+0

Tôi vẫn nhận được lỗi trong tất cả các bao gồm được sử dụng bởi ssl.h, tại sao gcc không thể tìm thấy những? – jahmax

5

tiếng Anh của tôi không phải là rất tốt nhưng tôi tìm thấy một bản vá cho vấn đề này trong một trang web Trung Quốc về

yum install openssl yum cài đặt openssl-devel

cài đặt này và tha thôi, thử nghiệm trong centos 5.4 và keepalived-1.2.7]

1

Đối với lỗi gcc này, bạn nên tham chiếu đến gcc document about Search Path.

Nói tóm lại:

1) Nếu bạn sử dụng dấu ngoặc nhọn (<>) với #include, gcc sẽ tìm kiếm tập tin tiêu đề đầu tiên từ đường dẫn hệ thống như /usr/local/include/usr/bao gồm, v.v.

2) Đường dẫn được chỉ định bởi -L dir tùy chọn dòng lệnh, sẽ được tìm kiếm trước thư mục mặc định.

3) Nếu bạn sử dụng báo giá ("") với #include là #include "tệp", thư mục chứa tệp hiện tại sẽ được tìm kiếm trước tiên.

như vậy, câu trả lời cho câu hỏi của bạn là như sau:

1) Nếu bạn muốn sử dụng tập tin tiêu đề trong thư mục mã nguồn của bạn, thay thế <> bằng "" trong chỉ thị #include.

2) nếu bạn muốn sử dụng tùy chọn dòng lệnh -I, thêm nó vào dòng lệnh biên dịch của bạn. (Nếu thiết lập CFLAGS trong biến môi trường, Nó sẽ không tham chiếu tự động)

3) Về cấu hình gói (openssl .pc), tôi không nghĩ rằng nó sẽ được tham chiếu mà không khai báo rõ ràng trong cấu hình xây dựng.

+0

'-ldir' là sai. với '-l', nó luôn là' lib' thay vì 'dir'. –

+1

@GulluButt Nó phải là -Ldir. Tôi đã sửa đổi câu trả lời của mình. – gzh

+0

Tôi đang gặp vấn đề tương tự được đề cập trong câu hỏi này. Tôi đang cố gắng để biên dịch một ví dụ từ liên kết dưới đây nhưng nó không hoạt động. Tôi không chắc chắn nếu cài đặt của tôi nếu ok hay không. Khi tôi nói '-lssl', nó tìm' ssl.dll' trong thư mục cài đặt của 'openssl'? http://simplestcodings.blogspot.de/2010/08/secure-server-client-using-openssl-in-c.html#!/2010/08/secure-server-client-using-openssl-in- c.html –

2

Bạn cần phải bao gồm đường dẫn thư viện (-L/usr/local/lib /)

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

Nó làm việc cho tôi.

Các vấn đề liên quan