2010-02-27 15 views
5

किसी कारण से, मुझे सी फाइल को संकलित करने के लिए जीसीसी का उपयोग करना चाहिए, फिर विजुअल सी ++ 2008 प्रोजेक्ट के खिलाफ लिंक करें।_alloca के बिना जीसीसी संकलन कैसे करें?

(मैं वर्तमान नवीनतम जीसीसी संस्करण इस्तेमाल किया: cygwin जीसीसी 4.3.4 20090804.)

लेकिन वहाँ एक समस्या है: जीसीसी हमेशा की तरह, _alloca के साथ एक बड़ा सरणी आवंटित

और कुलपति लिंकर नहीं कर सकते __alloca प्रतीक को हल करें।

उदाहरण के लिए

,

int func() 
{ 
    int big[10240]; 
    .... 
} 

इस कोड को हालांकि मैं _alloca समारोह स्पष्ट रूप से फोन नहीं किया _alloca निर्भरता बनाता है।

(सरणी आकार मायने रखती है अगर मैं बदल 10240 -।> 128, सब कुछ ठीक)

मैं जीसीसी विकल्प की कोशिश की -fno-निर्मित-alloca या -fno-निर्मित है, लेकिन कोई किस्मत।

क्या जीसीसी को _alloca का उपयोग न करना संभव है? (या दहलीज समायोजित करें?)

+0

क्यों सिर्फ 'malloc()' स्पष्ट रूप से उपयोग नहीं? –

+0

यह मेरा लिखित स्रोत नहीं है और संपादित करने के लिए कुछ जटिल है। और शायद मूल लेखक मॉलोक को कॉल करने के लिए दंड नहीं चाहते थे। – shkim

+1

इस मामले में एलोका का उद्देश्य यह सुनिश्चित करना है कि स्टैक इस सरणी को पकड़ने के लिए काफी बड़ा है। माइक्रोसॉफ्ट कंपाइलर को एलोका की आवश्यकता नहीं है; यह इस स्टैक जांच कोड को सीधे फ़ंक्शन में छोड़ देता है। स्थानीय लोग छोटे होने पर स्टैक जांच की आवश्यकता नहीं होती है। क्या होता है यदि आप -नो-बिल्टिन-एलोका और -फनो-बिल्टिन का उपयोग नहीं करते हैं? –

उत्तर

7

सबसे अच्छी बात यह है कि वीसी ++ के साथ सभी कोड संकलित करना होगा। यदि यह संभव नहीं है ..

आपको साइगविन के बजाय mingw gcc का उपयोग करना चाहिए। यह आउटपुट कोड के लिए डिज़ाइन किया गया है जो वीसी ++ रनटाइम के खिलाफ जुड़ा होगा, सिगविन लाइब्रेरी नहीं। विशेष रूप से, यह __alloca के बजाय वीसी ++ रनटाइम फ़ंक्शन __chkstk को कॉल करेगा।

+0

मैंने मिनीजीडब्ल्यू (जीसीसी 3.4.5 मिंगव-विस्टा विशेष आर 3) की कोशिश की और एक साधारण सी स्रोत संकलित किया। लेकिन डंपिन परिणाम ने __alloca निर्भरता दिखायी: डंपबिन/प्रतीकों test.obj ... 00 सी 00000000 यूएनडीईएफ बाहरी टाइप करें। __alloca ... क्या मिंगव के लिए एक विशेष विकल्प है? – shkim

+0

आह, क्षमा करें। Mingw.org gcc यह करता है। टीडीएम जीसीसी 4.x मिंगव बिल्ड आउटपुट __chkstk। http://www.tdragon.net/recentgcc/ – andrewffff

+0

धन्यवाद। मैंने टीडीएम जीसीसी को हमेशा __chkstk आउटपुट की जांच की, लेकिन वीसी -2008 रिलीज बिल्ड पर _chkstk आउटपुट करता है, और डीबग बिल्ड पर _alloca_probe आउटपुट करता है। मुझे लगता है कि मुझे 4K के तहत स्थानीय वैरिएबल का उपयोग करने के लिए कोड संपादित करना चाहिए। – shkim

3

आप बस अपना खुद का _alloca दिनचर्या लिख ​​सकते हैं और उसके खिलाफ लिंक कर सकते हैं। जीसीसी लाइब्रेरी स्रोत को देखें कि यह क्या करना है।

+0

जब मैंने वीएस -2008 में _alloca लागू किया, तो मुझे मिला: त्रुटि C2169: '_alloca': आंतरिक फ़ंक्शन, – shkim

+0

परिभाषित नहीं किया जा सकता है, मुझे लगता है कि आप संभवतः विजुअल स्टूडियो के बजाय जीसीसी का उपयोग करके अपने कस्टम _alloca को कार्यान्वित करना चाहते हैं। –

1

ऐसा लगता है कि _alloca माइक्रोसॉफ्ट द्वारा बहिष्कृत किया गया है और अब वीएस2005 के बाद उनके रनटाइम पुस्तकालयों में नहीं है। नए रनटाइम पुस्तकालय _malloca का समर्थन करते हैं।

आपके विकल्प अच्छे दिखते नहीं हैं। आप इसके बजाए वीएस2005 के साथ निर्माण करने का प्रयास कर सकते हैं। शायद सिगविन के पास एक विकल्प है जहां आप इसे बता सकते हैं कि आप एक नई रनटाइम लाइब्रेरी का उपयोग कर रहे हैं (और यदि वे अभी तक इसका समर्थन नहीं करते हैं, तो आप इसे एक फीचर अनुरोध के रूप में फाइल कर सकते हैं)।

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