2010-12-04 12 views
12

से लिंक करना मैंने स्रोत से ओपनएसएसएल बनाया है (एक जानबूझकर पुराना संस्करण; ./config && make && make test के साथ बनाया गया है) और मेरे प्रोग्राम के खिलाफ लिंक करने के लिए make install किए बिना मैंने जो भी बनाया है उसका उपयोग करना पसंद करेंगे।ओपनएसएसएल पुस्तकालयों को एक प्रोग्राम

आदेश में नाकाम रहने वाली है:

gcc -Wall -Wextra -Werror -static -Lopenssl/openssl-0.9.8k/ -lssl -lcrypto 
-Iopenssl/openssl-0.9.8k/include -o myApp source1.o source2.o common.o` 

और मैं करने के लिए इसी तरह की त्रुटियों की एक श्रृंखला प्राप्त करते हैं:

common.c:(.text+0x1ea): undefined reference to `SSL_write' 

यह मैं लगता है कि मेरी OpenSSL के साथ कुछ अजीब है बनाता है।

/usr/bin/ld: cannot find -lssl 
/usr/bin/ld: cannot find -lcrypto 

मैं OpenSSL गलत तरीके से संकलन कर रहा हूँ: अगर मैं अपने आदेश से -Lopenssl/openssl-0.9.8k/ छोड़ देते हैं, त्रुटि करने में असमर्थ होने के लिए बदल जाता है? या मुझे इसे कैसे हल करना चाहिए?

उत्तर

23

मूर्खतापूर्ण "लिनक्स-इस्म्स" फिर से हड़ताल! जाहिर है, मैं की तरह (क्या man gcc में इंगित करता है के बावजूद) मेरी आदेश ऐसी है कि -L और -l सामान अंत पर है बदलने की जरूरत:

gcc -Wall -Wextra -Werror -static -o myApp source1.o source2.o common.o -Lopenssl/openssl-0.9.8k/ -lssl -lcrypto -Iopenssl/openssl-0.9.8k/include

+15

यह '-lssl -lcrypto' है जो अंत में होने की आवश्यकता है। जब लिंकर द्वारा लाइब्रेरी स्कैन की जाती है, तो केवल वे फ़ंक्शंस जिनके लिए पहले से ही अनिर्धारित संदर्भ हैं, लिंक किए गए हैं। तो आपको लिंक लाइन की शुरुआत में "खपत" वस्तुओं को और अंत में "आपूर्ति" वस्तुओं को रखने की आवश्यकता है। – caf

+1

मैं हमेशा अपने उत्तरों को स्वीकार करने के बारे में अजीब हूं। हालांकि मैं इसे अभी स्विच कर दूंगा। – mrduclaw

+0

कबीले llvm के लिए यह कैसे भिन्न है? – saruftw

4

क्यों नहीं करते आप make install उपयोग करना चाहते हैं? यह निर्देशिका आप चाहते हैं में उत्पन्न binaries कॉपी कर सकते हैं यदि आपने पहले ./configure --prefix $HOME/target_library_install_directory

करने के लिए इसे पारित कर दिया है कि आप हर पुस्तकालय के साथ इस चाल का उपयोग किया है आप का निर्माण और स्थापित करते हैं, आप तो LIBRARY_PATH वातावरण चर को लक्ष्य निर्देशिका जोड़ सकते हैं और उपयोग करने से बचें सकता है - एल विकल्प।

+0

यह जानना अच्छा है, लेकिन मुझे यकीन नहीं है कि मैंने अपने '-L' को कहां रखा है। फिर भी मतदान, फिर भी। – mrduclaw

+0

मैं आगे बढ़ने जा रहा हूं और इसे उत्तर के रूप में स्वीकार कर रहा हूं क्योंकि यह संभवतः ऐसा करने का सही तरीका है। मेरे विशेष मामले में, मैं नहीं चाहता था कि मेरे कोड (और संशोधित ओपनएसएसएल कोड) को चेक करने के लिए कुछ भी करना है, लेकिन 'मेक' करना है। – mrduclaw

1

यदि आप ऑटोटूल का उपयोग करते हैं, या आप cURL जैसे ऑटूल प्रोजेक्ट का निर्माण कर रहे हैं, तो आप pkg-config का उपयोग करने में सक्षम होना चाहिए। विचार यह है कि ऑटोटूल पैकेज ओपनएसएसएल के पैकेज कॉन्फ़िगरेशन को पढ़ेगा और चीजें आपके लिए "बस काम करेंगी"।

ओपनएसएसएल पैकेज कॉन्फ़िगरेशन लाइब्रेरी नाम openssl है।

आप इसे मेकफ़ाइल आधारित प्रोजेक्ट में ऐसा उपयोग करेंगे।

%.o: %.c 
     $(CC) -o [email protected] -c `pkg-config --cflags openssl` $^ 

target: foo.o bar.o baz.o 
     $(CC) -o [email protected] `pkg-config --libs openssl` $^ 

इसके अलावा How to use pkg-config in Make और How to use pkg-config to link a library statically देखते हैं।

+0

'pkg-config' के बारे में इस उत्तर के लिए धन्यवाद। क्या आप समझा सकते हैं कि मैं पांच वर्ष का हूं, 'pkg-config' क्या है और यह वास्तव में कैसे काम करता है? यह कैसे हासिल हुआ कि यह स्वचालित रूप से डीआईआर आदि शामिल करने के लिए सभी लिंक ढूंढता है। बेशक मैं इसे जादू की तरह इस्तेमाल कर सकता हूं लेकिन यह जानना बहुत अच्छा है कि यह आंतरिक रूप से कैसे काम करता है – barney

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