2017-06-01 8 views
13

पर स्विफ्ट क्रॉस संकलन एक ओएस एक्स कंप्यूटर से एक स्विफ्ट बाइनरी संकलित करना संभव है ताकि यह एक अतिरिक्त बाइनरी के बिना लिनक्स चलाने वाले सर्वर पर चलाया जा सके, जिसे गतिशील रूप से लिंक करने की आवश्यकता है?सिंगल लिनक्स बाइनरी

मैं -target को स्विफ्ट कमांड में पास करने और किसी अन्य पैरामीटर को पास करने की तरह सोच रहा हूं ताकि यह सभी निर्भरताओं को स्थिर रूप से लिंक कर सके, लेकिन मुझे यकीन नहीं है कि सटीक आदेश क्या हैं।

-target के लिए सटीक मूल्य अपेक्षाकृत कमजोर दिखता है।

क्या मुझे सही स्ट्रिंग को -target पैरामीटर में सही स्ट्रिंग पास करने में सक्षम होने के लिए सही लक्ष्य वितरण जानने की आवश्यकता है?

+0

शायद मैं आपके प्रश्न को गलत समझता हूं, लेकिन लिनक्स बाइनरी (एल्फ़) और मैक बाइनरी (माच-ओ) [संगत नहीं हैं] (https://stackoverflow.com/questions/9439436/is-a-linux-executable- संगत-साथ-os-x)। – TheDarkKnight

+0

हां, जाहिर है वे नहीं हैं। क्रॉस संकलन का मतलब है एक ओएस से एक अलग लक्ष्य ओएस में संकलन। उदाहरण के लिए, काम करने के लिए एक लिनक्स बॉक्स, और एक विंडोज संगत exe संकलन। मैंने पहले ऐसा नहीं किया है, लेकिन मैंने लोगों को इस तरह की चीजें करने के बारे में बात की है, इसलिए मुझे लगता है कि यह संभव है। – hasen

+0

मैंने यह नहीं सोचा था कि यह मूल ऐप्पल कंपाइलर्स के साथ ओएस एक्स पर संभव है, लेकिन यह प्रश्न ब्याज के साथ देखेगा। – TheDarkKnight

उत्तर

11

से पर github

  • लक्ष्य स्रोतों पढ़ने लिनक्स होगा
  • मशीन x86_64

यह प्राथमिक build script

से बुलाया जाता होगा इस तरह कभी एक हिस्सा उत्तर देता है प्रश्न

- लक्ष्य के लिए सटीक मूल्य बल्कि छिपी हुई प्रतीत होता है।

मैक ओएसएक्स के लिए एक जीसीसी टूलचैन स्थापित करें जो लिनक्स को पुनः लक्षित कर सकता है, उदाहरण के लिए, मैं एक रेपो जिसे OSXCross देख सकता हूं।

स्क्रिप्ट चलाने से पहले जीसीसी को पर्यावरण चर के मानों की आपूर्ति करें, जो टूलचैन का संदर्भ है।

दुर्भाग्य से, यह गारंटी नहीं देता है कि यह काम करेगा, लेकिन इसे आज़माएं और देखें कि क्या होता है।

+0

धन्यवाद ओपी। :) – t0mm13b

1

क्या ओएस एक्स कंप्यूटर से एक तेज बाइनरी संकलित करना संभव है ताकि यह एक अतिरिक्त बाइनरी के बिना लिनक्स चलाने वाले सर्वर पर चलाया जा सके, जिसे गतिशील रूप से लिंक करने की आवश्यकता है?

संक्षिप्त उत्तर? निश्चित रूप से यह है! जब आप अपना दिल डालते हैं तो कुछ भी संभव है!

क्या यह कुशल है? स्वाभाविक रूप से, नहीं।

जबकि मुझे यकीन है कि यहां हर किसी को क्या एक संकलक करता है, इस सवाल के लिए और उन की अपनी नवीनतम, एक संकलक एक आवेदन है कि मानव पठनीय कोड धर्मान्तरित और एक बाइनरी फ़ॉर्मेट में यह नक्शे है से परिचित है कर रहा हूँ कि एक कंप्यूटर समझ सकता है। हालांकि यह उल्लेखनीय होना चाहिए कि सभी कंप्यूटर समान नहीं हैं। प्रत्येक कंप्यूटर ऑपरेटिंग सिस्टम के मुकाबले एक अलग द्विआधारी मैपिंग होता है, इसलिए एक सरल ऑपरेशन जैसे मूल्यों की प्रतिलिपि एक मशीन पर 1010 और दूसरे पर 0101 के रूप में व्यक्त की जा सकती है। जैसा कि पहले कई सवाल में पहले कहा, and for example this one, कई प्रोग्रामिंग भाषाओं मशीनों की एक किस्म भर में बनाने योग्य रहे हैं, लेकिन क्योंकि प्रत्येक कंप्यूटर एक अलग द्विआधारी मानचित्रण है उनमें से बहुत कुछ पोर्टेबल उन्हें भर में कर रहे हैं।

~~~~~~~ तो हम इसे कैसे ठीक कर सकते हैं? ~~~~~~~

  • खैर समाधान के एक नंबर इसे ठीक करने के देखते हैं। सबसे स्पष्ट विधि है कि आप अपने पर्यावरण को लक्षित वातावरण और अपने दिल की सामग्री में अपना प्रोग्राम बनाएं। आपने स्पष्ट रूप से पहले से ही वर्चुअल मशीन के माध्यम से किया है और यह आमतौर पर डेवलपर करेगा। यह अब तक का सबसे आसान समाधान है लेकिन उस प्रश्न के उद्देश्य को हरा देता है जहां आप अपनी ओएसएक्स मशीन से बनाना चाहते हैं।

इससे पहले आपने कहा था कि आपने लोगों को लिनक्स मशीनों पर विंडोज प्रोग्राम संकलित करने के बारे में बात करते हुए सुना है। Cygwin विंडोज़ फ्रेमवर्क प्राप्त करने के उद्देश्य से एक विकास मंच है जो आमतौर पर लिनक्स मशीनों पर मौजूद नहीं होता है और कई प्रोग्राम विंडोज़ फ्रेमवर्क के साथ दिमाग में बनाया जा सकता है। हालांकि, इसके सभी काम बाइनरी जोड़ रहे हैं ताकि संकलक के पास कुछ उचित स्थान हों, जब विंडो केवल विन्यास कॉन्फ़िगरेशन में पाए जाते हैं। यह सब करने के लिए एक कार्यक्रम के लिए सफलतापूर्वक बंदरगाह पर आवश्यक बाइनरी कॉन्फ़िगरेशन शुरू कर रहा है। यह दूसरे विकल्प में संबंध है।

  • दूसरा एक संकलक आता है जो क्रॉस प्लेटफार्म संकलन का समर्थन करता है। जबकि मैं वर्तमान में कंपाइलर्स से अपरिचित और/या अपरिचित हूं, यह तकनीकी रूप से एक वैध समाधान है, लेकिन क्या मैं इसे विश्वसनीय कहूंगा? शायद ऩही। यदि आप कुछ भी पर अधिक काम जोड़ रहे हैं तो आपके कंपाइलर को न केवल एक कंप्यूटर प्रोग्राम के लिए एक कंप्यूटर प्रोग्राम के सिंटैक्स को सही तरीके से मैप करना होगा, इसे को नई बाइनरी में जोड़ने का समय बर्बाद करना होगा। इसके अतिरिक्त आपको कंपाइलर को इन लिंकिंग को याद रखना होगा जो इस संकलक के लिए मेमोरी स्पेस को अधिक बर्बाद कर सकता है।

फिर भी, इस तरह के सिस्टम और दूर के बीच है और क्या उसके काम करने की गारंटी कितनी अच्छी तरह compilers मेंटेनर उनके सामान जानता है पर निर्भर करता है, कि कितने समय में वे इसे अद्यतन आदि आदि और संभावना है कि वे भी प्रदर्शन किया कुछ कर रहे हैं पहली जगह में बाइनरी के मैपिंग को सही करने के लिए कुछ ऐसा नहीं है जिसे मैं अपना जीवन दूँगा।

  • तीसरा और शायद सबसे आदर्श समाधान कंटेनर प्रौद्योगिकियों जैसे docker में देखना है। उनके कंटेनर आपके ऐप को बनाने और इसे बनाने के तरीके के बारे में कुछ भी बदलने या संशोधित किए बिना इसे नए मशीनों पर बंद करने के लिए अनिवार्य रूप से तरीके हैं। बस एक बनाएं, इसे एक कंटेनर में स्टोर करें, इसे अपनी पसंद की मशीन पर बंद करें और इसे अपने वर्तमान प्रोजेक्ट में एकीकृत करें। इसके बारे में सोचने के लिए आओ, डॉकर जैसे कंटेनर सिस्टम को उस चीज़ को रोकने के लिए बनाया गया था जिसे आप वर्तमान में अनुभव कर रहे हैं, जहां आपके पास एक मशीन पर एक स्रोत कोड काम कर रहा है लेकिन कोई और जगह नहीं है। डॉकर की तरह कुछ भी किसी भी मशीन पर आपके कोड को प्रत्येक नई मशीन के लिए पुन: संकलित किए बिना चलाने में सक्षम होगा।

डोकर कंटेनर संचार, आवेदन उदाहरण के लिए कंटेनर के लिए एक दिलचस्प रूपरेखा प्रदान करता है और एक काफी सरल प्रलेखन कि यह को देखने के लिए अगर अपनी परियोजना अपने हिस्से के कुछ डोकर में पोर्ट हो सकता था देखने के लिए सार्थक होगा है।

यह कहा जा रहा है कि आप जिस समस्या का सामना कर रहे हैं उसे ठीक करने के कई तरीके हैं, इसलिए जब आप एक सॉफ्टवेयर इंजीनियर हैं, तो यह आपके ऊपर है कि यह आपके प्रोजेक्ट को संभालने का सबसे आदर्श तरीका होगा।

// संपादित //

इस संपादित करेंगे एक बेहतर प्रतिक्रिया एक बार ड्रॉप-मृत थक नहीं im किया जाना है।

+0

सिग्विन लिनक्स पर विंडोज ऐप के लिए नहीं है, यह विंडोज़ पर लिनक्स ऐप्स के लिए है (बीटीडब्ल्यू लिंक के लिए धन्यवाद इसलिए मुझे Google का उपयोग नहीं करना पड़ा;)) – Markaos

+0

इसके अलावा, सर्वर शायद स्विफ्ट के कुछ हिस्सों का उपयोग नहीं करता है जो ' टी लिनक्स पर उपलब्ध नहीं है (जैसे जीयूआई लाइब्रेरी, मुझे लगता है), तो यह कुशल होना चाहिए – Markaos

+0

@ मार्ककास मुझे पता है कि इसके लिए साइगविन क्या नहीं है। मैं इस तथ्य का जिक्र कर रहा था कि यह उन बाइनरी को जोड़ता है जिन्हें आपको कोडिंग दृष्टिकोण से चाहिए जो आप कहीं और प्राप्त नहीं कर सकते हैं। यदि आप लिनक्स पर काम कर रहे एक सी ++ कोडर थे और आप चाहते थे कि आपका ऐप विंडोज़ पर चलने के लिए आपको कुछ बाइनरी पैकेजों की आवश्यकता होगी जो विंडोज़ और लिनक्स नहीं हैं। मैं इंप्रेशन सिगविन के तहत यह तय किया गया था। जिस क्षमता का मैं जिक्र कर रहा था वह स्मृति, समय और जटिलता के संदर्भ में मूल प्रश्न के बारे में पूछने के लिए आवश्यक कामकाज है। – Jouster500

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