2010-07-30 6 views
58

मैं एक छोटी सीसी फ़ाइल को संकलित करने की कोशिश कर रहा हूं जिसमें निम्नलिखित शामिल हैं:OpenSSL के साथ .c फ़ाइल को संकलित करने के लिए कैसे शामिल है?

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

उसी फ़ोल्डर में जहां मेरे पास .c फ़ाइल है, मेरे पास उन सभी फ़ाइलों (और अधिक) के साथ एक/openssl है, सिनैप्टिक पैकेज मैनेजर में मैं ओपनएसएसएल स्थापित करता हूं, मैं इसे संकलित करने की कोशिश कर रहा हूं:

gcc -o Opentest Opentest.c -lcrypto 

लेकिन मुझे हमेशा त्रुटियां मिलती हैं:

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 फ़ाइल है , मेकफ़ाइल या ./configure नहीं है।

मैंने पहले ही कोशिश की है:

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

और फिर संकलित करने की कोशिश की लेकिन मुझे एक ही त्रुटि मिलती है।

openssl के साथ संकलित करने के लिए मुझे क्या करना चाहिए?

उत्तर

86

आपके शामिल पथ इंगित करते हैं कि आपको सिस्टम के OpenSSL स्थापना के विरुद्ध संकलित होना चाहिए।आपके पास अपनी पैकेज निर्देशिका में .h फ़ाइलें नहीं होनी चाहिए - इसे /usr/include/openssl से उन्हें चुनना चाहिए।

सादा ओपनएसएसएल पैकेज (libssl) में .h फ़ाइलें शामिल नहीं हैं - आपको विकास पैकेज भी इंस्टॉल करने की आवश्यकता है। इसे डेबियन, उबंटू और इसी तरह के वितरण पर libssl-dev नाम दिया गया है, और CentOS, फेडोरा, रेड हैट और इसी तरह के libssl-devel पर।

+0

@jahmax: कोई चिंता नहीं। आप पाएंगे कि डेबियन-आधारित डिस्ट्रोज़ में अधिकांश लाइब्रेरी पैकेजों में '* -dev' पैकेज होता है जिसे आपको लाइब्रेरी के विरुद्ध संकलित करने की आवश्यकता होगी (और अक्सर '* -dbg' पैकेज जिसमें लाइब्रेरी के लिए डिबगिंग प्रतीक होते हैं)। – caf

+1

आपने मेरा दिन बनाया ;-) –

+2

ठीक है। libssl-dev उबंटू पर osslsigncode-1.5.2 बनाने के लिए चाल थी। – karmakaze

9

-I ध्वज को ठीक से जीसीसी में उपयोग करें।

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

-I निर्देशिका openssl फ़ोल्डर युक्त इंगित करना चाहिए।

+2

gcc -I/home/username/प्रोग्रामिंग/openssl/-o Opentest -lcrypto Opentest.c यह मुझे वही त्रुटियां देता है :( – jahmax

+1

यदि openssl फ़ोल्डर '/ path/to/openssl/'तो विकल्प' -I/path/to/'@jahmax होना चाहिए। इसलिए आप'/home/username/प्रोग्रामिंग/' – Earlz

+0

@Earlz चाहते हैं: धन्यवाद, मैंने यह कहने की कोशिश की कि अंतिम स्पष्ट रेखा के साथ, लेकिन यह आवश्यक है मिस्ड हो गया है। – Borealid

4

OpenSSL हेडर वर्तमान निर्देशिका के openssl उप निर्देशिका में कर रहे हैं, का उपयोग करें:

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

पूर्व प्रोसेसर इस तरह के "./openssl/ssl.h" के रूप में एक नाम बनाने के लिए लग रहा है "." से -I विकल्प और कोण ब्रैकेट में निर्दिष्ट नाम। यदि आपने डबल कोट्स (#include "openssl/ssl.h") में नाम निर्दिष्ट किए हैं, तो आपको कभी भी प्रश्न पूछने की आवश्यकता नहीं हो सकती है; यूनिक्स पर कंपाइलर आमतौर पर वर्तमान निर्देशिका में डबल कोट्स में संलग्न हेडर की खोज करता है, लेकिन यह कोण ब्रैकेट्स (#include <openssl/ssl.h>) में संलग्न हेडर के लिए ऐसा नहीं करता है। यह क्रियान्वयन परिभाषित व्यवहार है।

आप यह नहीं कहते कि ओपनएसएसएल पुस्तकालय कहां हैं - आपको निर्दिष्ट करने के लिए उचित विकल्प और तर्क जोड़ने की आवश्यकता हो सकती है, जैसे '-L /opt/openssl/lib'।

+0

दोनों के लिए पथ शामिल हैं- मैंने कोशिश की- l/usr/lib लेकिन मुझे अभी भी ssl.h से शामिल सभी में त्रुटियां मिलती हैं, जीसीसी उन्हें क्यों नहीं ढूंढ सकता? – jahmax

4

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} 

आप निर्देशिका पथ और इस से Libs पथ शामिल करें नोट कर सकते हैं। अब फ़ाइलों को शामिल करने के लिए आपका उपसर्ग /home/username/Programming है। इसलिए आपके शामिल फ़ाइल विकल्प -I//home/username/Programming होना चाहिए।

(हाँ मैं इसे ऊपर टिप्पणी से मिला) यह सिर्फ हेडर के बारे में लॉग दूर करने के लिए है। -lcrypto लाइब्रेरी से जुड़ने के लिए आप -L<Lib path> विकल्प भी प्रदान कर सकते हैं।

+0

मुझे अभी भी एसएसएलएच द्वारा उपयोग किए जाने वाले सभी में त्रुटियां मिलती हैं, जीसीसी उन्हें क्यों नहीं ढूंढ सकता? – jahmax

5

मेरी अंग्रेजी नहीं बहुत अच्छा है, लेकिन मैं एक CHINESSE वेब पेज में इस मुद्दे के लिए एक पैच पाया

यम openssl यम स्थापित स्थापित openssl-devel

इस स्थापित करने और था, यह में परीक्षण किया Centos 5.4 और keepalived-1.2.7]

1

इस जीसीसी त्रुटि के लिए, आपको gcc document about Search Path पर संदर्भ देना चाहिए।

संक्षेप में:

1) आप कोण कोष्ठक का उपयोग करते हैं (<>) # शामिल साथ, जीसीसी सिस्टम पथ से सबसे पहले हेडर फाइल खोज करेंगे जैसे /usr/स्थानीय/शामिल और /usr/, आदि

2) पथ एल dir कमांड लाइन विकल्प के द्वारा निर्दिष्ट में शामिल हैं, इससे पहले कि डिफ़ॉल्ट निर्देशिका की खोज की जाएगी।

3) यदि आप #include "फ़ाइल" के साथ उद्धरण ("") का उपयोग करते हैं, तो वर्तमान फ़ाइल वाली निर्देशिका को पहले खोजा जाएगा।

हां, तो आपके सवाल का जवाब निम्नलिखित है:

1) आप, अपने स्रोत कोड फ़ोल्डर में हेडर फाइल का उपयोग # शामिल निर्देश में < की जगह> "के साथ" चाहते हैं।

2) यदि आप मैं कमांड लाइन विकल्प का उपयोग करने, यह आपके संकलन कमांड लाइन में जोड़ें। (यदि वातावरण चर में CFLAGS निर्धारित करते हैं, यह स्वचालित रूप से संदर्भित नहीं होगा)

3) के बारे में पैकेज विन्यास चाहते हैं (openssl .pc), मुझे नहीं लगता कि इसे निर्माण कॉन्फ़िगरेशन में स्पष्ट रूप से घोषित किए बिना संदर्भित किया जाएगा। (एल/usr/स्थानीय/lib /)

+0

'-ldir' गलत है। '-l' के साथ, यह' dir' के बजाय हमेशा 'lib' है। –

+1

@ गुलुबत्त यह -एलडीआईआर होना चाहिए। मैंने अपना जवाब संशोधित कर दिया है। – gzh

+0

मुझे इसी समस्या का सामना करना पड़ रहा है जिसका उल्लेख इस प्रश्न में किया गया है। मैं नीचे दिए गए लिंक से एक उदाहरण संकलित करने की कोशिश कर रहा हूं लेकिन यह काम नहीं कर रहा है। मुझे यकीन नहीं है कि अगर मेरी स्थापना ठीक है या नहीं। जब मैं '-lssl' कहता हूं, तो यह' openssl' की स्थापना निर्देशिका में 'ssl.dll' की तलाश करता है? 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

आप पुस्तकालय पथ शामिल करने की ज़रूरत

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

यह मेरे लिए काम करता है।

संबंधित मुद्दे

 संबंधित मुद्दे