2011-01-10 13 views
6

मैं निम्नलिखित कोड को लिनक्स पर कैसे संकलित करूं? उबंटू 10.10 (मावेरिक मीरकट) का उपयोग करना।लिनक्स पर कंपाइलर्स द्वारा समर्थित उद्देश्य-सी ब्लॉक हैं?

 
#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    void (^block)() = ^{ 
    printf("Hello world"); 
    }; 
    block(); 
} 

मैंने कोशिश की:

 
gcc -x objective-c t.c 

और मिल गया:

 
t.c: In function 'main': 
t.c:5: error: expected identifier or '(' before '^' token 

यह कैसे काम करने के लिए पर कोई मार्गदर्शन की सराहना की है। प्रतिक्रिया के आधार पर संपादित प्रश्न, धन्यवाद।

+1

क्या आपने कोशिश की है? यह आपके प्रश्न का उत्तर दे सकता है .... – Jasarien

+1

लिनक्स के तहत उद्देश्य-सी कोड संकलित करने के लिए "उपकरण" उपकरण नहीं है, इसलिए उसने कोशिश की और विफल हो सकता है, और अब एक और टूल की खोज करता है। – Alfonso

+0

क्षमा करें दोस्तों, मैंने संकलन करने की कोशिश की। मैंने अधिक जानकारी के लिए प्रश्न अपडेट किया। मैंने एक Google खोज की और मेनलाइन जीसीसी में स्वीकार नहीं किए जा रहे ब्लॉक के बारे में पढ़ा। संकलित करने के लिए पोस्ट किया गया सरल कोड प्राप्त करने के लिए मुझे पर्याप्त जानकारी नहीं मिल सका। – user565452

उत्तर

9

आधिकारिक जीसीसी ब्लॉक समर्थन शामिल नहीं है। इसके लिए, आपको या तो ऐप्पल के पैच का उपयोग करने की आवश्यकता है, या क्लैंग, एलएलवीएम-आधारित कंपाइलर का उपयोग करना है जिसमें अच्छा उद्देश्य-सी समर्थन है (क्योंकि ऐप्पल इसके विकास को वित्त पोषित कर रहा है)। लिनक्स पर, आप जीसीसी को ऐप्पल के पैच को लागू करने की कोशिश नहीं कर रहे हैं। बस झुकाव के साथ जाओ।

हालांकि, बस एक संकलक कि ब्लॉक का समर्थन करता है होने पर्याप्त नहीं है - क्रम भी ब्लॉक का समर्थन की जरूरत है। लिनक्स पर जीएनयूएसटीपी के साथ आप दो रनटाइम का उपयोग कर सकते हैं, और बीएसडी के लिए भी एक है (libdispatch को फ्रीबीएसडी पर पोर्ट किया गया है, और इसे ब्लॉक-सक्षम रनटाइम की आवश्यकता है)।

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

+0

में डुप्लिकेट/हल किया गया जवाब के लिए धन्यवाद! – user565452

+1

ब्लॉक्स और एआरसी सहित लिनक्स पर सब कुछ कैसे बनाया जाए, इस पर एक कदम-दर-चरण है। http://feloneouscat.wordpress.com/2013/10/25/objective-c-on-ubuntu-12-04-with-blocks-and-arc/ –

0

हाँ संक्षिप्त उत्तर है लेकिन यह कुछ काम की आवश्यकता हो सकती।

अब जवाब यह है कि एप्पल मुक्त स्रोत compilers (जीसीसी और LLVM) उपयोग करती हैं इसलिए ऐसा कोई कारण नहीं क्यों वे लिनक्स पर वापस पोर्ट नहीं किया जा सकता है है। क्या किसी ने वास्तव में यह काम किया है, मुझे नहीं पता। थोड़ा pedantic होने के लिए, सी-स्तर पर ब्लॉक लागू किया जाता है। इसका मतलब यह है कि ब्लॉक प्राप्त करना अपेक्षाकृत आसान होगा लेकिन आप उन पुस्तकालयों में से अनुपलब्ध होंगे जो उनका उपयोग करते हैं। चूंकि रॉबिन कहता है, यूआई प्रमुख है लेकिन आप पोर्ट GCD पोर्ट करने में सक्षम होंगे।

0

(मैं इस तथ्य से नफरत है कि मैं अभी तक के बाद से मेरी प्रतिष्ठा पर्याप्त नहीं है टिप्पणी नहीं कर सकता है, ताकि इस "जवाब" के लिए कारण नहीं है)

@ user57368 पहले पैराग्राफ में सही है, तथापि, पिछले दो पैराग्राफ के साथ कुछ "मुद्दे" हैं:

जीसीडी (ग्रैंड सेंट्रल डिस्पैचर नामक ऐप्पल का "शानदार" थ्रेडिंग टूल) रनटाइम थ्रेडिंग है जो libdispatch का उपयोग करता है जो " dispatch_ * "funtions। ब्लॉक निर्माण का उपयोग कर जीसीडी बहुत अच्छा उपयोग करता है (और कोड "nicer") बनाता है। हालांकि GCD करता नहीं, ब्लॉक की जरूरत है के रूप में वहाँ dispatch_ * फ़ंक्शन कॉल के समारोह संस्करण हैं।

ब्लाकों एक भाषा lamdba आधारित निर्माण है, और पर निर्भर नहीं करता, और न ही GCD/libdispatch कार्यक्षमता प्रदान करते हैं। वे मैकोज़क्स/आईओएस/एक्सकोड दुनिया में एक ही समय में ऐप्पल द्वारा पेश किए गए थे, लेकिन वे एक-दूसरे पर निर्भर नहीं हैं।

पीएस: हाल ही में देखे गए फ्रीबीएसडी के लिए एक libdispatch कार्यान्वयन है, और लिनक्स पर भी एक विकल्प को लागू करने के कुछ प्रयास हैं।

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