2012-06-09 15 views
6

रनिंग: जीसीसी संस्करण 4.2.1 (एप्पल इंक 5664 का निर्माण)बूस्ट + जीसीसी + precompiled शीर्ष लेख के साथ धीरे संकलन समय

मैं एक डिफ़ॉल्ट precompiled शीर्ष लेख के साथ एक सेब XCode प्रोजेक्ट बनाया। यह बहुत धीमा प्रतीत होता है, और एक मुख्य कार्य फ़ाइल के साथ एक छोटी मुख्य फ़ाइल में संकलन के लिए 6 सेकंड लगते हैं, जो कि मैं एक नए एसएसडी ड्राइव में अपग्रेड करने के बाद होता हूं। मैं एक लैपटॉप पर हूं, लेकिन मेरे पास आरक्षण है जो वर्कस्टेशन में अपग्रेड करने से मेरी समस्या कम हो जाएगी। अगर मैं प्रीकंपील्ड हेडर बंद कर देता हूं तो मुख्य फ़ाइल एक सेकेंड के अंदर संकलित होती है। ऐसा लगता है कि एक प्रीकंपील्ड हेडर का उपयोग करके सभी फाइलों में जुर्माना लगाया जाता है। यह देरी मुझे कोड के साथ संकलन और प्रयोग से बचना चाहता है जो अच्छा नहीं है।

#pragma once 

#include <algorithm> 
#include <bitset> 
#include <complex> 
#include <deque> 
#include <fstream> 
#include <functional> 
#include <iostream> 
#include <istream> 
#include <iterator> 
#include <limits> 
#include <list> 
#include <locale> 
#include <map> 
#include <numeric> 
#include <ostream> 
#include <queue> 
#include <set> 
#include <sstream> 
#include <stack> 
#include <stdexcept> 
#include <streambuf> 
#include <string> 
#include <valarray> 
#include <vector> 

#include <boost/smart_ptr/scoped_ptr.hpp> 
#include <boost/smart_ptr/scoped_array.hpp> 
#include <boost/smart_ptr/shared_ptr.hpp> 
#include <boost/smart_ptr/shared_array.hpp> 
#include <boost/smart_ptr/make_shared.hpp> 
#include <boost/smart_ptr/weak_ptr.hpp> 
#include <boost/smart_ptr/intrusive_ptr.hpp> 

#include <boost/regex.hpp> 
#include <boost/thread.hpp> 
#include <boost/bind/bind.hpp> 
#include <boost/bind/apply.hpp> 
#include <boost/bind/protect.hpp> 
#include <boost/bind/make_adaptable.hpp> 

#include <boost/asio.hpp> 
//#include <boost/asio/ssl.hpp> 


#include <boost/property_tree/ptree.hpp> 
#include <boost/random.hpp> 
#include <boost/lexical_cast.hpp> 
#include <boost/date_time/gregorian/gregorian.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/date_time/local_time/local_time.hpp> 
#include <boost/date_time/time_zone_base.hpp> 
#include <boost/circular_buffer.hpp> 
#include <boost/accumulators/accumulators.hpp> 
#include <boost/accumulators/statistics.hpp> 

मैं आत्मा, जो वास्तव में संकलन समय ऊपर जाना बनाता है शामिल नहीं किया है: यहाँ मैं अपने precompiled शीर्ष लेख में शामिल कर रहा हूँ क्या है।

+0

तो एक मुख्य कार्य के साथ एक छोटी सी मुख्य फ़ाइल में कोई कोड शामिल नहीं है "ऊपर सूचीबद्ध सभी सुविधाओं के साथ एक परियोजना की तुलना में संकलन करने में बहुत कम समय लगता है? क्या इसकी उम्मीद नहीं की जानी चाहिए? – jedwards

+0

इसके अलावा, प्रीकंपील्ड हेडर की मेरी समझ यह है कि वे केवल संकलन समय को सहेजते हैं, अन्यथा उन्हें कई स्रोतों से 'शामिल' के माध्यम से बार-बार संकलित किया जाएगा। यह आपके लिए मामला नहीं है, इसलिए मैं कल्पना करता हूं कि प्रीकंपील्ड हेडर का उपयोग करने के साथ आपके संकलन समय के बिना समान होगा। यही है, आप precompiled हेडर का उपयोग करके एक लाभ का एहसास नहीं होगा। आपको स्रोत-फ़ाइल-विशिष्ट आधार पर आपको जो कुछ चाहिए उसे वास्तव में सीमित करना चाहिए। – jedwards

+0

और इसका क्या अर्थ है: "यह देरी मुझे कोड के साथ संकलन और प्रयोग से बचना चाहती है जो अच्छा नहीं है।" – jedwards

उत्तर

7

जीसीसी के प्रीकंपील्ड हेडर एक बहुत ही खास तरीके से काम करते हैं। केवल एक प्रीकंपील्ड हेडर फ़ाइल किसी दिए गए स्रोत फ़ाइल में उपयोग की जा सकती है। -H का उपयोग यह दिखाने के लिए करें कि दी गई हेडर फ़ाइल प्रीकंपिल्ड संस्करण का उपयोग कर रही है या नहीं।

इसके अलावा, आपको हेडर फ़ाइल को सटीक उसी कंपाइलर ध्वज के साथ संकलित करना होगा जो स्रोत फ़ाइल के रूप में उपयोग करता है।

एक PCH वातावरण स्थापित करने के लिए विशिष्ट तरीका इस तरह है:

main.cpp:

#include "allheaders.hpp" 

int main() { /* ... */ } 

allheaders.hpp:

#include <algorithm> 
// ... everything you need 

संकलन:

g++ $CXXFLAGS allheaders.hpp     # 1 
g++ $CXXFLAGS -H -c -o main.o main.cpp  # 2 
g++ $LDFLAGS -o myprogram main.o    # 3 

चरण # 1 के बाद आपको फ़ाइल allheaders.hpp.gch फ़ाइल के साथ समाप्त होना चाहिए, जो कि बहुत बड़ा होना चाहिए। चरण # 2 में -H ध्वज को अतिरिक्त आउटपुट उत्पन्न करना चाहिए जो आपको बताता है कि प्रीकंपील्ड हेडर फ़ाइल का उपयोग किया जा रहा है। चरण # 3 निष्पादन योग्य लिंक करता है।

विचार यह है कि चरण # 1 संभावित रूप से बहुत लंबा समय ले सकता है, लेकिन चरण # 2 बहुत तेज़ हो जाना चाहिए।

+1

मैंने जीसीसी कमांड का विश्लेषण किया है और यह एक 308 एमबी छद्म-पाठ फ़ाइल का संदर्भ दे रहा है जो प्रसंस्कृत प्रीकंपिल्ड हेडर प्रतीत होता है। प्रीकंपील्ड हेडर प्रत्येक स्रोत फ़ाइल के लिए स्वत: शामिल है, जिसे कुछ लोगों को नहीं लगता है, और लगभग 6 सेकंड की विलम्ब का परिचय देता है। मुझे दृश्य स्टूडियो के साथ इस समस्या को याद नहीं है हालांकि वीएस के साथ मैं हमेशा इसे एक बेईमान वर्कस्टेशन पर चलाता हूं।एक 6 सेकंड अंतराल जब मैं एक फ़ाइल में एक पत्र बदलता हूं अस्वीकार्य है और विकास चक्र पर बर्बाद समय के मिनट/घंटे/दिन तक जोड़ता है। – user805547

+0

ठीक है, आपको स्मार्ट के प्रकार होना चाहिए जिसके बारे में हेडर को प्रीकंपाइल करना है। बेशक आपके पास एक ही आकार-फिट नहीं होना चाहिए-सभी पीसीएच। आदर्श रूप से आप प्रत्येक * स्रोत फ़ाइल के लिए व्यक्तिगत रूप से अलग "सभी शीर्षलेख" शीर्षलेख बनायेंगे। व्यावहारिक रूप से, मैं उन फ़ाइलों के लिए उस उपचार को आरक्षित करता हूं जो वास्तव में सभी भारी बूस्ट सामग्री को लागू करता है। –

+0

मैं हर जगह बूस्ट का उपयोग करता हूं इसलिए इन्हें पीसीएच में डालने से व्यक्तिगत फाइलें धीरे-धीरे संकलित हो जाती हैं। मुझे लगता है कि गंभीर सी ++ विकास के लिए यह लैपटॉप और सॉफ्टवेयर बहुत धीमा है। कोको के लिए यह ठीक है लेकिन बूस्ट और टेम्पलेट्स और मेटाप्रोग्रामिंग का भारी उपयोग एक हत्यारा है। – user805547

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