2009-11-18 14 views
7
सार्वभौमिक वस्तुओं संकलन

हम अपने प्रोजेक्ट के लिए जीसीसी के साथ precompiled हेडर का उपयोग कर रहे हैं और उन्हें निर्माण इस तरह:Precompiled हेडर और पर OSX

gcc $(CFLAGS) precompiledcommonlib.h 

अब मैं पर OSX 10.6 परियोजना के निर्माण कर रहा हूँ और निफ्टी का उपयोग करने की कोशिश कर रहा

gcc $(CFLAGS) -c -arch i386 -arch x86_64 commonlib.c 

हालांकि, ऐसा लगता है इस precompiled हेडर के लिए काम नहीं करता है:

gcc $(CFLAGS) -arch i386 -arch x86_64 precompiledcommonlib.h 
Undefined symbols for architecture i386: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture i386 
collect2: ld returned 1 exit status 
Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
lipo: can't open input file: /var/folders/z1/z1A0sPkqGDyPrZWo9ysVK++++TI/-Tmp-//cc3W2gwd.out (No such file or directory) 
इस तरह एक ही समय में सभी आर्किटेक्चर के लिए निर्माण की सुविधा

संपादित करें: मार्क के अनुसार एक्सकोड के अनुसार इंगित किया गया है कि प्रीकंपिल्ड हेडर को प्रत्येक आर्किटेक्चर के लिए अलग से बनाया जाना है, इसलिए मेरा प्रश्न यह है कि यदि सार्वभौमिक वस्तुओं का निर्माण करते समय जीसीसी सही प्रीकंपिल्ड हेडर का उपयोग करने का कोई तरीका है।

मुझे एहसास है कि मैं प्रत्येक आर्किटेक्चर को एक्सकोड की तरह पूरी तरह से अलग कर सकता हूं लेकिन मैं उन्हें एक ही समय में बनाने की संभावना का लाभ उठाऊंगा और अलग-अलग बिल्ड कॉन्फ़िगरेशन के साथ गड़बड़ नहीं करना चाहूंगा।

+0

मैं बस भी ऐसा ही करने की कोशिश की, और मैं क्या इकट्ठा कर सकते हैं से , आप _cannot_ ऐप्पल के जीसीसी दो '-arch' झंडे देते हुए एक पीसीएच फ़ाइल उत्पन्न करते हैं।क्यूटी लोग काम करने के लिए कुछ अजीब काम कर रहे हैं, आप इसे देखना चाहेंगे ... http://qt.gitorious.org/qt/qt/merge_requests/2193 – Lucas

उत्तर

2

मैं सिर्फ वही प्रश्नों में भाग गया और @ लुकास द्वारा प्रदान किए गए लिंक के साथ पीछा किया, इसलिए मैंने सोचा कि मैं यहां जो मिला वह प्रदान करता हूं।

सबसे पहले नोट, यदि आप लिनक्स से मैकोज़ में अपने जीसीसी कोड को पोर्ट कर रहे हैं, तो सेब द्वारा प्रदान किए गए जीसीसी का संस्करण उचित रूप से .hpp फ़ाइल एक्सटेंशन का पता नहीं लगाता है।

mac:openstudio lefticus$ g++ test.hpp 
ld: warning: ignoring file test.hpp, file was built for unsupported file format which is not the architecture being linked (x86_64) 
Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

एक और जवाब में उल्लेख किया है, यह सुनिश्चित करें कि जीसीसी जानता है किस प्रकार की फ़ाइल आप संकलन कर रहे हैं बनाने के लिए -x तर्क निर्दिष्ट करने के लिए सबसे अच्छा है।

g++ -x c++-header test.hpp 

यह test.hpp.gch अपेक्षित बनाता है।

आप कमांड लाइन पर किसी भी वास्तुकला निर्दिष्ट कर सकते हैं और GCH ठीक से बनाता है

g++ -x c++-header test.hpp -arch i386 

या

g++ -x c++-header test.hpp -arch x86_64 

आप एक से अधिक वास्तुकला प्रदान करते हैं, तो आपको त्रुटि पोस्टर उल्लेख मिलता है।

mac:openstudio lefticus$ g++ -xc++-header test.hpp -arch i386 -arch x86_64 
Undefined symbols for architecture i386: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture i386 
collect2: ld returned 1 exit status 
Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
lipo: can't open input file: /var/folders/DM/DMTpbjzHHX08IEqGgEAORE+++TI/-Tmp-//ccDeWigf.out (No such file or directory) 

कुंजी आर्किटेक्चर आप अलग से जरूरत तो संकलन के दौरान उचित एक लोड करने के लिए -Xarch_ तर्क का उपयोग संकलित करने के लिए है:

g++ -x c++-header -arch x86_64 x86_64/test.hpp 
g++ -x c++-header -arch i386 i386/test.hpp 

g++ -arch i386 -arch x86_64 test.cpp -Xarch_i386 -Ii386 -Xarch_x86_64 -Ix86_64 
+0

बिना किसी प्रोजेक्ट का निर्माण करता हूं तो मुझे वह त्रुटि मिलती है उत्कृष्ट खोज! आपका बहुत बहुत धन्यवाद! – rasmusb

3

आपकी समस्या आर्किटेक्चर नहीं है। दोनों

समस्या विफल है कि आप मुख्य कार्य के बिना निष्पादन योग्य बनाने की कोशिश कर रहे हैं।

फ़ाइल नाम सामान्य है। मुझे संदेह है कि यदि आप XCode में लाइब्रेरी टेम्पलेट के साथ प्रोजेक्ट प्रारंभ करते हैं तो मुझे लाइब्रेरी बनाना है।

+0

अपना समय लेने के लिए धन्यवाद। 'gcc foo.h' आज़माएं। यह क्या उत्पादन करता है? क्या आपको अभी भी लगता है कि मैं निष्पादन योग्य बनाने की कोशिश कर रहा हूं? एक जल्दबाजी, सादा गलत जवाब का उल्लेख नहीं करना और संरक्षक दृष्टिकोण एक विशेष रूप से आकर्षक संयोजन नहीं है। – rasmusb

+0

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

+0

अच्छी कॉल। जब मैं मुख्य विधि – surajz