c++ - ऑब्जेक्ट फ़ाइल में बहुत से अनुभाग हैं




visual-studio boost (3)

हम सामान्य रूप से boost :: serialization और टेम्पलेट्स का भारी उपयोग कर रहे हैं। सब ठीक चल रहा है।

सिवाय इसके कि, हमने अपने विंडोज़ बिल्ड पर एक झटका लगाया है। ऐसा लगता है कि ऑब्जेक्ट फ़ाइलों में समस्याएं बहुत बड़ी हैं। हम जी ++ 4.7.0 के साथ मिनजीडब्लू / एमएसआई का उपयोग कर रहे हैं।

c:/mingw/bin/../lib/gcc/mingw32/4.7.0/../../../../mingw32/bin/as.exe: CMakeFiles/source.dir/sourcecode.cpp.obj: too many sections (33396)
C:\Users\username\AppData\Local\Temp\ccnAocvD.s: Assembler messages:
C:\Users\username\AppData\Local\Temp\ccnAocvD.s: Fatal error: can't write CMakeFiles/source.dir/sourcecode.cpp.obj: File too big

मास्टर Google ने इस संग्रहीत संदेश का खुलासा किया, http://sourceforge.net/mailarchive/forum.php?thread_name=CA%2Bsc5mkLvj%3DW9w2%3DsY%3Dc_N%3DEwnsQuPDEX%3DiBcbsbxS3CuE_5Bg%40mail.gmail.com&forum_name=mingw-users

इसमें, यह इंगित करता है कि एक और व्यक्ति ने उतना ही उतना ही झटका लगाया। यह विजुअल स्टूडियो /bigobj विकल्प के लिए एक विकल्प को इंगित करता है जो हमें लगता है कि हमें क्या करना होगा। हालांकि, हम विजुअल स्टूडियो में जाने में असमर्थ हैं।

एक सुझाव था कि असेंबलर विकल्पों में --श-आकार जोड़ना था। इससे मदद नहीं मिली।

अगर मुझे गलत नहीं लगता है, तो समस्या इस तथ्य में निहित है कि ऑब्जेक्ट फ़ाइलों में उनमें 2 ^ 16 प्रविष्टियों की सीमा है। असल में, त्रुटि संदेश के अनुसार, मैं उद्यम करता हूं कि यह एक हस्ताक्षरित 2 ^ 16 प्रविष्टियां है, लेकिन यह मूंगफली है। विजुअल स्टूडियो के लिए /bigobj विकल्प 2 ^ 32 में बदल जाएगा। मेलिंग सूची परिणाम जीसीसी के लिए समकक्ष विकल्प के बारे में नहीं पता था। इसके अलावा Google के परिणाम प्रासंगिक नहीं दिखते हैं।

इस बिंदु पर हमें इस सीमा को पाने के लिए हमारे कोड (यूघ) को दोबारा करना होगा। लेकिन मुझे अभी भी चिंता है कि, भारी templating के साथ, हम इस मुद्दे को बार-बार चला सकते हैं (हम पहले से ही तीन स्रोत फ़ाइलों के साथ इसमें भाग चुके हैं)।

तो मेरा सवाल इस प्रकार है; माइक्रोसॉफ्ट के /bigobj विकल्प के बराबर एक जीसीसी है? क्या कोई तीसरा विकल्प है जिसे मैं अभी तक नहीं मिला हूं?


त्रुटि "%B: too many sections (%d)" bfd/coffcode.h में स्थित फ़ंक्शन coff_compute_section_file_positions() फ़ंक्शन से "%B: too many sections (%d)" आता है। यह तब उत्पादन होता है जब आउटपुट .obj फ़ाइल (सीओएफएफ प्रारूप में) में 32766 से अधिक अनुभाग होते हैं। इस त्रुटि से बचने का कोई तरीका नहीं है, कम से कम नहीं यदि आप विंडोज 'पीई / सीओएफएफ ऑब्जेक्ट प्रारूप का उपयोग करना चाहते हैं; सीओएफएफ फाइलें फ़ाइल हेडर में "नंबरऑफक्शन" के लिए केवल दो बाइट्स का उपयोग करती हैं।

यह मुझे स्पष्ट नहीं है कि क्यों (जीएनयू असेंबलर) 65536-माइनस -1 के बजाय 32768-माइनस -2 पर अनुभागों की संख्या को कैप्स करता है (धारा 0 आरक्षित है); लेकिन किसी भी तरह से, यह पर्याप्त नहीं हो सकता है यदि आप टेम्पलेट्स का भारी उपयोग कर रहे हैं और आपके कंपाइलर COMDAT अनुभागों के माध्यम से टेम्पलेट लागू करता है।

जैसा कि आपने पहले ही देखा है, माइक्रोसॉफ्ट के कंपाइलर को गुजरने /bigobj कारण यह 2 31 खंडों के साथ एक मंग किए गए सीओएफएफ प्रारूप को आउटपुट करने का कारण बनता है, जो "किसी के लिए पर्याप्त होना चाहिए।" हालांकि, मंगेड प्रारूप औपचारिक रूप से अनियंत्रित है, और मुझे इस विषय पर कोई अनौपचारिक दस्तावेज (ब्लॉग पोस्ट या क्या है-आप) नहीं दिखाई देता है, इसलिए जब तक /bigobj प्रतिलिपि वाला कोई व्यक्ति /bigobj लिए एक विनिर्देश लिख नहीं सकता है, तो यह जीएनयू उपकरण में शामिल होने का अधिक मौका नहीं खड़ा है।

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


मुझे इस मामले में कुछ अपडेट मिले, ऐसा लगता है कि यह x64 विंडोज़ के लिए नए binutils में तय किया गया है, https://sourceware.org/ml/binutils/2014-03/msg00114.html और http://sourceforge.net/p/mingw-w64/bugs/341/ । हालांकि, मैंने इसका परीक्षण नहीं किया क्योंकि यह फिक्स 32 बिट संस्करणों पर लागू नहीं होता है।


समाधान विकल्प जोड़ने के लिए -Wa,-mbig-obj यदि GCC का आपका संस्करण उस विकल्प का समर्थन करता है। आपको शायद संकलन चरण के दौरान केवल इसकी आवश्यकता है, लिंकर चरण नहीं।

यदि आपका कंपाइलर उस विकल्प का समर्थन नहीं करता है, तो आपको mingw- w64 और MSYS2 का उपयोग करना चाहिए।





mingw