2016-02-03 7 views
6

मैं Crystal में एक प्रोग्राम लिख रहा हूं, कि मैं निष्पादन के लिए संकलन और अन्य प्रणालियों में स्थानांतरित करना चाहता हूं। आदर्श रूप में, इसमें कोई निर्भरता नहीं होनी चाहिए, क्योंकि लक्ष्य प्रणाली लिनक्स की ताजा स्थापना होगी।मैं किसी निर्भरता के साथ क्रिस्टल निष्पादन योग्य कैसे उत्पन्न कर सकता हूं?

अफसोस की बात है कि, मैं libc निर्भरता के आसपास नहीं जा सकता, इसलिए मुझे संभवतः एक ऐसे सिस्टम पर निष्पादन योग्य संकलन करना होगा जिसमें libc के निम्नतम संस्करण को लक्षित करना है, जिसे मैं लक्षित करना चाहता हूं। मुझे लगता है कि यह आगे संगत होना चाहिए।

हालांकि मुझे libssl में कठिनाई हो रही है। डेबियन खरखरा की डिफ़ॉल्ट प्रतिष्ठानों libssl साथ आने के लिए लग रहे हैं नहीं है, इसलिए जब मेरे निष्पादन योग्य चल मैं इस त्रुटि मिलती है:

error while loading shared libraries: libssl.so.1.0.0: 
cannot open shared object file: No such file or directory 

मुझे लगता है यह निर्भरता मौजूद है मैं अपने स्रोत में require "http/client" क्योंकि। हालांकि, मैं कोई एसएसएल से संबंधित कॉल नहीं करता, क्योंकि मैं केवल असुरक्षित वेबसाइटों से कनेक्ट करने के लिए इसका उपयोग करता हूं।

मुझे स्पष्ट रूप से libevent-2.0.so.5 पर निर्भरता भी है। संभवतः सभी क्रिस्टल कार्यक्रम करते हैं। कौन जानता है क्रिस्टल की कितनी अन्य निर्भरताएं हैं?

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

+0

मुझे यह प्रश्न पसंद है; एक समय में सबकुछ स्थिर रूप से जुड़ा हुआ था। कीड़ा बदल जाता है। – will

उत्तर

7

लिनक्स में, आप साझा पुस्तकालयों को सूचीबद्ध कर सकते हैं जिन्हें निष्पादन योग्य को ldd कमांड का उपयोग करने की आवश्यकता है। ओएसएक्स में, otool -L का उपयोग उसी उद्देश्य के लिए किया जा सकता है।

आम तौर पर, लिंकर निष्पादन योग्य बनाने के दौरान साझा पुस्तकालयों का उपयोग करेगा यदि यह उन्हें पा सके। तो, आपको क्या करना है, लिंकर को स्थिर पुस्तकालयों का उपयोग करने के लिए मजबूर करना है। (भविष्य में हम इस विकल्प को मजबूर करने के लिए कंपाइलर में एक झंडा जोड़ सकते हैं)

आपको इनमें से कुछ स्थिर पुस्तकालयों को/opt/crystal/embedded/lib में ढूंढना चाहिए। हम पोर्टेबल क्रिस्टल कंपाइलर उत्पन्न करने के लिए इनका उपयोग करते हैं।

इन पुस्तकालयों का उपयोग करने के लिए आपको चला सकते हैं:

$ LIBRARY_PATH=/opt/crystal/embedded/lib crystal build my_app.cr 

कि दूसरों मानक ऐसे स्थान पर इंस्टॉल विचार करने से पहले कि निर्देशिका में उपलब्ध पुस्तकालयों को प्राथमिकता देनी चाहिए।

दुर्भाग्यवश, ओपनएसएसएल क्रिस्टल के साथ वितरित नहीं किया गया है, इसलिए आपको या तो libssl और libcrypto का एक स्थिर संस्करण कॉपी या निर्माण करना होगा। वैसे भी, यह किसी भी लिनक्स वितरण में उपलब्ध एक सामान्य पुस्तकालय है।

libc के संबंध में, यह और अधिक मुश्किल है। हम पुरानी CentOS और डेबियन वितरण का उपयोग करके रिलीज के लिए क्रिस्टल बाइनरी संकलित करते हैं ताकि इसे कई और libc संस्करणों के साथ संगत बनाया जा सके।

+1

बहुत बढ़िया, धन्यवाद। मुझे क्रिस्टल बिल्ड FILE.cr - क्रॉस-कंपाइल "लिनक्स x86_64" - लक्ष्य "x86_64-अज्ञात-लिनक्स-gnu" 'और' सीसी FILE.o -o FILE -Wl, -Bstatic -levent -lpcre के साथ सफलता मिली -lssl -lgc -lcrypto -lz -Wl, -Bdynamic -ldl -lrt -lpthread -lc', लेकिन आपका तरीका बहुत आसान है। मैंने '.a' फ़ाइलों का पता लगाने के लिए 'apt-file' का उपयोग किया, फिर उन्हें क्रिस्टल lib निर्देशिका में सॉफ्टलिंक किया। –

+0

64-बिट लिनक्स में एक स्थिर रूप से लिंक किए गए 32-बिट संकलित निष्पादन योग्य तरीके से काम करेगा? –

+0

'objdump' आकस्मिक रूप से गतिशील लाइब्रेरी निर्भरताओं को सूचीबद्ध करने के लिए उपयोगी है। –

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

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