2011-08-27 6 views
20

मुझे "-arch x86_64 -arch i386" झंडे को दबाए जाने की आवश्यकता है वाफ जीसीसी को पास कर रहा है।ओएसएक्स पर वाफ के साथ ओपनजीएल/एसडीएल एप्लिकेशन संकलित करते समय मैं '-arch', 'x86_64' ध्वज कैसे दबा सकता हूं?

मैं एसडीएल/ओपनगल एप्लिकेशन का निर्माण कर रहा हूं। अगर मैं 32 बिट एसडीएल क्रम के खिलाफ लिंक मैं त्रुटि

Undefined symbols for architecture i386: 
    "_SDL_Quit", referenced from: 
     __del_video in SDL_functions.c.2.o 
     __init_video in SDL_functions.c.2.o 

अगर मैं 64 बिट एसडीएल क्रम के खिलाफ लिंक मिलता है, मैं त्रुटि "वास्तुकला x86_64 के लिए अपरिभाषित प्रतीकों" मिल

संकलक जाहिरा तौर पर झंडे

उपयोग कर रहा है
-arch x86_64 -arch i386 

मैं समझता हूं कि यह ओएसएक्स पर जीसीसी को आर्किटेक्चर दोनों के लिए संकलित करने का प्रयास करने का कारण बनता है। मैं या तो 64 बिट के लिए संकलित करना चाहता हूं, या 32 बिट के लिए संकलित करना चाहता हूं। मैं एक वास्तुकला के लिए झंडे को कैसे दबा सकता हूं?

उत्तर

-1

मुझे अन्य झंडे को दबाने के लिए कमांड/ध्वज जारी करने का कोई तरीका नहीं पता है। हालांकि, केवल 64 या 32 बिट्स के लिए संकलित करने के लिए, आप क्रमशः -m64 या -m32 का उपयोग कर सकते हैं। चूंकि आप दोनों आर्किटेक्चर के लिए संकलित कर रहे हैं, -एम 32 आपका एकमात्र विकल्प हो सकता है क्योंकि -m64 i386 के लिए काम नहीं करेगा।

+0

-m32 काम नहीं करता है। यह अभी भी 64 बिट झंडा जोड़ता है। मुझे विन्यास में 64 बिट झंडे को 32 बिट झंडे में बदलने के लिए एक sed कमांड लिखना पड़ा और मुझे 64 बिट बिल्ड प्राप्त हुआ। क्या मैं इसे केवल 64 बिट करने के लिए मजबूर कर सकता हूं? – HaltingState

+1

मुझे यकीन नहीं है कि मैं आपको समझता हूं। X86_64 या i386 पर आर्क ध्वज सेट करना प्रोसेसर परिवार का अर्थ है। एम 64 या एम 32 फ्लैग को सेट करने का मतलब है निर्देश उत्पन्न। X86_64 परिवार 64 और 32 बिट दोनों निर्देशों को संभाल सकता है। आप कह रहे हैं कि आपने 64 बिट फ्लैग (जो वास्तव में?) को 32 बिट में बदल दिया है और 64 बिट बिल्ड किया है? यदि आप केवल 64 बिट चाहते हैं, तो आप i386 ध्वज का उपयोग नहीं कर सकते हैं। – Jerry

+1

मुद्दा यह है कि वेफ इन झंडे को उपयोगकर्ता नहीं जोड़ रहा है - और उपयोगकर्ता केवल x86_64 चाहता है – Mark

2

मुझे अपने मामले में पता चला कि डबल आर्क झंडे here की उत्पत्ति कर रहे थे, खासकर distutils.sysconfig.get_config_var('LDFLAGS') से। यह LDFLAGS देता है कि पायथन सोचता है कि आपको पाइथन मॉड्यूल को लिंक करना चाहिए। मेरे मामले में, file $(which python) एक "2 आर्किटेक्चर के साथ मच-ओ सार्वभौमिक बाइनरी" है, इसलिए अजगर आप के साथ लिंक करना चाहिए सोचता है -arch x86_64 -arch i386 -Wl,F.

मेरे समस्या यह है कि मैं एक अजगर देशी मॉड्यूल है कि अजगर और एक अन्य पुस्तकालय के खिलाफ लिंक करने के लिए की जरूरत का निर्माण किया गया था जो दोनों मेहराबों के साथ नहीं बनाया गया था। दोनों मेहराबों के साथ अपने मॉड्यूल का निर्माण करते समय, "प्रतीक नहीं मिला" के साथ लिंकिंग विफल रही, क्योंकि दोनों मेहराब तीसरे पक्ष की लाइब्रेरी में उपलब्ध नहीं थे।

waf unfortunately doesn't allow you to override its computed flags with your own flags, as Automake does के बाद से, मैं केवल इस में मेरी ctx() वस्तु के साथ सीधे खिलवाड़ से ठीक कर सकता है मेरी wscript:

for var in ['CFLAGS_PYEMBED', 'CFLAGS_PYEXT', 'CXXFLAGS_PYEMBED', 
    'CXXFLAGS_PYEXT', 'LINKFLAGS_PYEMBED', 'LINKFLAGS_PYEXT']: 
    newvar = [] 
    for ix, arg in enumerate(ctx.env[var]): 
     if '-arch' not in (arg, ctx.env[var][ix - 1]): 
      newvar.append(arg) 
    ctx.env[var] = newvar 

(यह सब -arch झंडे और प्रासंगिक चर से उनके तर्कों को हटा जब से मैं भी गुजर रही थी। मेरे -arch मेरे CFLAGS में ध्वज, अब इसे ओवरराइड नहीं किया गया है।)

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

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