2014-11-04 8 views
6

मेरा कोड libcxx, sdl और कुछ अन्य libs का हर समय उपयोग करता है। मैं प्रत्येक हेडर को ध्यान में रखते हुए .pch कैसे उत्पन्न कर सकता हूं, इसमें कुछ अन्य शीर्षलेख भी शामिल हो सकते हैं (यहां तक ​​कि जटिल परिस्थितियों जैसे #ifdef # शामिल #endif। यही कारण है कि आवश्यक हेडर फाइल सूची को समझना मुश्किल है। क्या मुझे बस केवल सभी शीर्षलेख फ़ाइलों का उपयोग करना चाहिए वो फ़ोल्डर्स .pch बनाने के लिए? उस मामले में ऐसे .pch प्रदर्शन के उपयोग के बारे में क्या?कई शीर्षकों के लिए .pch कैसे उत्पन्न करें?

अद्यतन: यदि यह मायने रखता है कि मैं इसे क्लैंग (जीसीसी नहीं) के साथ उपयोग करने जा रहा हूं और क्लैंग सी एपीआई के माध्यम से अधिक विशिष्ट होना चाहता हूं । UPDATE2: एकल हेडर फाइल के लिए

मैं बना लिया है PCH:

MBA-Anton:pch asmirnov$ clang++ -x c++-header header.h -emit-pch -o header.pch 
MBA-Anton:pch asmirnov$ clang++ -include-pch header.pch source.cpp -o source -x c++ 

लेकिन मैं एकाधिक फाइलों के लिए पीएच उत्पन्न करने में असमर्थ था:

MBA-Anton:pch asmirnov$ clang++ -x c++-header header.h header2.h -emit-pch -o headers.pch 
clang: error: cannot specify -o when generating multiple output files 
+0

मुझे लगता है कि मैंने कहीं पढ़ा है कि जीसीसी का एसटीएल किसी भी तरह से पहले से संकलित है। क्या कोई इसकी पुष्टि कर सकता है? – alfC

उत्तर

1

सबसे पहले, मैंने केवल माइक्रोसॉफ्ट कंपाइलर के साथ जीसीसी के साथ पीएचसी का उपयोग नहीं किया है।

#ifdef इत्यादि सभी संकलन से पहले हल किए गए हैं, इसलिए यदि आप प्रीप्रोसेसर चर बदलते हैं तो पीसीएच फ़ाइल को संकलित किया जाता है। तो बस आपको आवश्यक libs की सभी फाइलें जोड़ें।

आम तौर पर, उन सभी शीर्षकों को शामिल करें जिनमें अक्सर बदलने की संभावना नहीं है (यानी बाहरी libs और आपके सिस्टम के कुछ हिस्सों जो स्थिर हैं)।

अपनी पीएच फ़ाइल में शीर्षकों को कई बार शामिल करने के बारे में ज्यादा चिंता न करें। चूंकि इस फ़ाइल को अक्सर संकलित नहीं किया जाएगा, इसलिए आप यहां उच्च संकलन समय को अनदेखा कर सकते हैं।

मुझे यकीन नहीं है कि अगर आप अपनी पीएच फ़ाइल में सब कुछ शामिल करते हैं तो अचूक फ़ाइल आकार बड़ा हो जाता है। यह मामला हो सकता है क्योंकि आप अन्यथा कोड कोड का उपयोग नहीं करते हैं जो आपके निष्पादन योग्य में संकलित हो जाते हैं क्योंकि आपने उन्हें अपनी पीएच फ़ाइल में जोड़ा है। आप इसे जांचना चाहेंगे।

अब, मेरे अनुभव से, एक और महत्वपूर्ण सवाल यह है कि संकलन करते समय या संकलन करते समय आपका संकलन प्रदर्शन धीमा होता है।

जब आपके पास उच्च लिंक समय होता है तो समस्या अधिक होती है कि आप अपने कोड में शीर्षलेखों में बहुत से शीर्षलेख शामिल करते हैं।

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

ऐसा इसलिए है क्योंकि वृद्धिशील संकलन बहुत अच्छी तरह से काम करता है लेकिन वृद्धिशील लिंकिंग नहीं करता है।

यहाँ करने के की एक छोटी लेकिन अच्छा संकलन और आगे घोषणा के बारे में क्या न करें है: http://www.chromium.org/developers/coding-style/cpp-dos-and-donts

+0

मेरे मामले में .pch का उपयोग करने का मुख्य लक्ष्य यदि हेडर सूची के रूप में संकलन/लिंकिंग समय को कम करना हमेशा समान होता है। मैं कुछ शीर्षकों को कई बार शामिल करने की चिंता नहीं करता लेकिन पीएच फ़ाइल में अनइडेड हेडर जोड़ने के बारे में चिंता करता हूं। यही तो प्रश्न है। – 4ntoine

2

GCC संकलक केवल एक ही शामिल precompiled शीर्ष लेख, as explained in this answer साथ अच्छी तरह से काम करता है।तो तुम जीसीसी में PCH उपयोग करना चाहते हैं, तो आप अपने सभी ऐप्लिकेशन में अनुवाद इकाइयों के लिए एक एकल हेडर फाइल करने के लिए (और उनमें से प्रत्येक वास्तव में एकल#include निर्देश के साथ शुरू कर देना चाहिए) की आवश्यकता होगी

मैं अनुमान लगाएं कि ऐसी स्थिति कुछ प्रीकंपील्ड हेडर का समर्थन करने वाले अन्य कंपाइलरों के लिए सहायक भी है।

सी ++ मानक के भविष्य संस्करण (C++14) पोस्ट मॉड्यूल तंत्र को परिभाषित कर सकता है। उदाहरण देखें n4047 प्रस्ताव।

ध्यान दें कि पूर्व-संकलित शीर्षलेख बहुत ही संकलक विशिष्ट हैं (जीसीसी के साथ, वे जीसीसी 4.9.1 से जीसीसी 4.9.2 तक उगते समय भी काम नहीं कर सकते हैं), इसलिए आपको उन पर अधिक निर्भर नहीं होना चाहिए।

+0

जीसीसी के बारे में जानकारी के लिए धन्यवाद। असल में मुझे यह जोड़ना पड़ा कि मुझे इसे क्लैंग के लिए चाहिए लेकिन मुझे नहीं पता था कि यह – 4ntoine

+0

मायने रखता है जैसा कि मैंने यहां पढ़ा है (http://clang.llvm.org/docs/PCHInternals.html) क्लैंग के पीएचसी आमतौर पर हेडर के बंडल के लिए जेनरेट होते हैं । – 4ntoine

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