2012-09-23 14 views
5

मैं एक बड़ी परियोजना पर काम कर रहा हूं जो कई पर्यावरण, मुख्य रूप से लिनक्स/जीसीसी और विंडोज़/एमएसवीसी के तहत बनना चाहिए। निर्माण को तेज करने के लिए, हम प्रीकंपील्ड हेडर का उपयोग करते हैं।जीसीसी पर प्रीकंपील्ड हेडर के साथ कोई गति नहीं (लेकिन दृश्य स्टूडियो के साथ बड़ी गति)

विंडोज कार्यान्वयन बहुत ही कुशल है: मेरे क्वाड-कोर हाइपरथ्रेड किए गए i7 बिल्ड समय पर 9 मिनट से 1.5 मिनट तक चला जाता है। हालांकि प्रीकंपील्ड हेडर का उपयोग प्रदर्शन में सुधार नहीं लगता है: दोनों मामलों में यह उसी कंप्यूटर पर वर्चुअल बॉक्स के तहत 22 मिनट या वास्तविक सर्वर पर लगभग 40 मिनट के भीतर बनाता है।

तो मैं स्पष्ट सोच रहा हूं कि मुझे किसी तरह से कुछ गलत मिला है और प्रीकंपील्ड हेडर अंदर लात नहीं कर रहा है। हालांकि मुझे यह नहीं मिल रहा है।

हमारी मेकफ़ाइल सीएमके द्वारा उत्पन्न की जाती है, इसलिए मैं हेडर और ऑब्जेक्ट फ़ाइलों को संकलित करने के लिए उपयोग किए गए कोड को पेस्ट कर सकता हूं।

हेडर बनाना:

/usr/bin/c++ -O3 -DNDEBUG --no-warnings "-I/mnt/code/server a/src/game" 
"-I/mnt/code/server a/src/game/vmap" "-I/mnt/code/server a/dep/include/g3dlite" 
"-I/mnt/code/server a/dep/include" "-I/mnt/code/server a/src/shared" 
"-I/mnt/code/server a/src/framework" "-I/mnt/code/server a/buildlinux" 
"-I/mnt/code/server a/buildlinux/src/shared" -I/usr/include/mysql 
"-I/mnt/code/server a/dep/acelite" -DDO_MYSQL -DHAVE_CONFIG_H 
-DVERSION=\"0.6.1\" -DSYSCONFDIR=\"../etc/\" -D_RELEASE -D_NDEBUG -x c++-header 
-o "/mnt/code/server a/buildlinux/src/game/pchdef.h.gch" "/mnt/code/server 
a/src/game/pchdef.h" 

एक वस्तु फ़ाइल संकलन:

/usr/bin/c++ $(CXX_DEFINES) $(CXX_FLAGS) "-I/mnt/code/server 
a/buildlinux/src/game" -include pchdef.h -Winvalid-pch -o 
CMakeFiles/game.dir/AccountMgr.cpp.o -c "/mnt/code/server 
a/src/game/AccountMgr.cpp" 

इनसाइट्स की सराहना कर रहे हैं, भले ही वे सीधे नहीं है इसके बाद के संस्करण के टुकड़े से निकाले जाते हैं।

+1

आप भाग्यशाली हैं, मैंने पाया कि जीसीसी के साथ प्रीकंपील्ड हेडर का उपयोग करना भी निर्माण को धीमा कर देता है। कुछ समय पहले CLANG बेहतर था, लेकिन अब यह प्रीकंपील्ड हेडर का उपयोग करके बेकार लगता है, जिससे एमएसवीसी को एकमात्र कंपाइलर के रूप में छोड़ दिया जाता है जो इससे लाभान्वित होता है। – Lothar

उत्तर

1

जीसीसी में प्रीकंपील्ड हेडर का उपयोग करते समय आपको कुछ ध्यान देने की आवश्यकता है। सबसे पहले, precompiled शीर्षलेख उसी तर्क के साथ बनाया जाना चाहिए क्योंकि cpp फ़ाइलों को संकलित किया जा रहा है। साथ ही मुझे लगता है कि आपने वास्तव में AccountMgr.cpp में precompiled शीर्षलेख शामिल किया है?

-H ध्वज के साथ संकलित करने का प्रयास करें, यह आउटपुट जिसमें फाइलों को शामिल किया जा रहा है। जांचें कि pchdef-file का उल्लेख किया गया है, और देखें कि अन्य फ़ाइलों में पार्स किए जा रहे हैं। अवैध पीसीएच फाइलों के बारे में शिकायत करने के लिए, -Winvalid-pch का उपयोग करने पर विचार करें।

+0

यदि आप आदेशों को देखते हैं, तो आप देखेंगे कि मैं पहले से ही '-विनावालिद-पीएच'' का उपयोग कर रहा हूं। इसके अलावा मैं 'AccountMgr.cpp' में हेडर फ़ाइल शामिल नहीं करता हूं, लेकिन शीर्षलेख' -include' विकल्प के साथ शामिल हो जाता है। मैं '-H' ध्वज का उपयोग करने की कोशिश करूंगा और वापस रिपोर्ट करूंगा। – Norswap

+0

मैंने "-H" ध्वज के साथ चीज़ को चलाया, यह निश्चित रूप से प्रीकंपील्ड हेडर को देखता है और उपयोग करता है। रहस्य मोटा है। – Norswap

+0

"उपयोग" से आपका मतलब है कि प्रदर्शित फ़ाइलों को शामिल करने की सूची से पता चलता है कि पूर्व-संकलित फाइलें फिर से शामिल नहीं हैं? अर्थात। एक बार बिना शामिल किए और एक बार चलाने के लिए प्रयास करें। यदि आउटपुट समान है, तो या तो आपके पीसीएच में कुछ भी प्रासंगिक शामिल नहीं है (या AccountMgr.cpp बहुत से उपयोग नहीं कर रहा है) और आप बस पीसीएच का उपयोग करके समय बर्बाद करते हैं, या यह एक नया संकेत है। – dseifert

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