कैसे बताएं कि हेडर फ़ाइल कहाँ से शामिल है?


97

मैं कैसे बता सकता हूं कि जी ++ कहां शामिल फ़ाइल खोजने में सक्षम था? मूल रूप से अगर मैं

#include <foo.h>

g ++ खोज पथ को स्कैन करेगा, पथ को जोड़ने या बदलने के लिए किसी भी शामिल विकल्पों का उपयोग करके। लेकिन, दिनों के अंत में, क्या कोई ऐसा तरीका है जिससे मैं foo.h का संपूर्ण रास्ता बता सकता हूं कि जी ++ ने संकलन करना चुना? विशेष रूप से प्रासंगिक अगर खोज मार्गों के असंख्य में एक से अधिक foo.h है।

पूरा करने के एक तरीके से कम ... कि वहाँ एक तरीका है जी + पाने के लिए मुझे बताओ कि इसकी अंतिम खोज मार्ग क्या चूक के बाद और सभी विकल्पों में शामिल है?


1
संबंधित: क्या यह बताने का कोई तरीका है कि किस माता-पिता में फ़ाइल शामिल है? यानी शामिल-से-ग्राफ दिखाने के लिए (संकेत: जीसीई-ई काफी नहीं है ... इसे प्राप्त करने के लिए संसाधित किया जा सकता है।)
क्रेजी गेलव

जवाबों:


78

यह निर्भरता देगा जो फाइलों को शामिल करने के निरपेक्ष मार्ग को सूचीबद्ध करता है:

gcc  -M showtime.c

यदि आप नहीं चाहते हैं कि सिस्टम शामिल है (यानी #include <something.h>) तो उपयोग करें:

gcc  -MM showtime.c

18
यह ध्यान दिया जाना चाहिए कि यदि आप "-o myObj.o" के साथ संयोजन में उपयोग करते हैं, तो आउटपुट, संकलित बाइनरी नहीं, "myObj.o" में जाता है। -एम का एक निहितार्थ है, इसलिए संकलन को विकृत नहीं किया गया है। मैंने पाया -MD इसके बजाय एक बहुत ही उपयोगी विकल्प है, यह संकलन करता है और इसके बजाय myObj.d में आउटपुट डालता है। * जैसे अजीब प्रभावों के बिना अपनी संकलित लाइन के लिए प्रिपेंड करने के लिए एक उपयुक्त परम बनाना। अब बाइनरी के बजाय आउटपुट शामिल है। आपकी सहायता के लिए धन्यवाद।
harschware

सभी संबंधित जीसीसी विकल्प यहां वर्णित हैं
अक्खन २०'१

105
g++ -H ...

फ़ाइलों को शामिल करने के पूर्ण पथ को एक प्रारूप में भी प्रिंट करेगा जो दिखाता है कि कौन सा हेडर शामिल है


7
यह मेरे अनुभव में -M की तुलना में अधिक सहायक प्रतीत होता है। मुझे क्या शामिल है के पदानुक्रमित प्रदर्शन पसंद है।
ब्रायन मिंटन

अच्छा है, यह डिबग उद्देश्य के लिए सहायक है।

1
यह सबसे अच्छा जवाब है। आप इसे अपनी निर्माण प्रक्रिया में जोड़ सकते हैं बिना कुछ और बदले।
टिम्मम

4
यह वास्तव में स्वीकृत उत्तर से अधिक प्रश्न का उत्तर देता है। केवल दुर्भाग्यपूर्ण समस्या यह है कि मैं इसे क्लैंग को सामान्य रूप से फ़ाइल संकलित करने की कोशिश करने से रोकने के लिए नहीं प्राप्त कर सका, इसलिए मैंने उपयोग करना समाप्त कर दिया clang++ -MM -H(जो थोड़ा उपयोगी संयोजन है)।
धोखेबाज़ 1024

@ rookie1024 clang++ -H -fsyntax-only ...यदि आप आउटपुट फाइल ( gccबहुत काम करता है) बनाने से बचना चाहते हैं तो इसका उपयोग करें ।
लेकेन्स्टाइन

8

ज़रूर इस्तेमाल करें

g++ -E -dI  ... (whatever the original command arguments were)

2
इस समाधान के कई लाभ हैं: 1. आप एक ही हेडर फाइल के कई इंक्लूजन की खोज कर सकते हैं (-H और -M प्रिंट में प्रत्येक में एक ही बार फाइल शामिल है) 2. आप देख सकते हैं कि यह कहां शामिल है (मूल का नाम और लाइन नंबर निर्देश शामिल करें)। 3. जिससे आप मज़बूती से (!) अंतर कर सकते हैं कि क्या एक हेडर प्रत्यक्ष या परोक्ष रूप से या दोनों में शामिल है (यह क्लीनअप के लिए है।)
हैगेलो

5

यदि आप -MMसंबंधित विकल्पों (या -M, आदि) में से एक का उपयोग करते हैं , तो आपको केवल उन हेडर की सूची मिलती है, जो अन्य सभी प्रीप्रोसेसर आउटपुट के बिना शामिल हैं (जो आपको सुझाए गए g++ -E -dIसमाधान के साथ मिलते हैं)।


g++ -MM t.ccकोई समावेश नहीं दिखाता है, बस t.o: t.cc। क्या इसे कुछ और चाहिए?
वैलीक

3
अच्छा - पूर्णता के लिए, आप /showIncludesविकल्प का उपयोग करके MSVC के साथ समान प्राप्त कर सकते हैं । MSVC आपको हेडर का नेस्टिंग दिखाने के लिए भी प्रेरित करेगा (मुझे -Mजीसीसी पर ऐसा नहीं है )।
माइकल बूर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.