सीसीसी और सी ++ हेडर फ़ाइलों के लिए जीसीसी कहां दिखता है?


185

यूनिक्स प्रणाली पर, शीर्ष लेख फ़ाइलों के लिए gcc कहाँ दिखता है?

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

जवाबों:


227
`gcc -print-prog-name=cc1plus` -v

यह कमांड gcc से पूछता है कि यह कौन सी C + प्रीप्रोसेसर का उपयोग कर रहा है, और फिर उस प्रीप्रोसेसर को पूछता है जिसमें यह शामिल है।

आपको अपने विशिष्ट सेटअप के लिए एक विश्वसनीय उत्तर मिलेगा।

इसी तरह, सी प्रीप्रोसेसर के लिए:

`gcc -print-prog-name=cpp` -v

2
`क्या मतलब है? मुझे इसके लिए खोजना मुश्किल हो रहा है।
मिजितुर्का

8
@mijiturka बैश में `(
ड्रू डॉर्मन

5
मुझे लगता है कि इसके बजाय C प्रीप्रोसेसर है ? मेरे डेबियन जेसी पर (सही ढंग से) एक और रास्ता देता है, जो हैcppcc1$(gcc -print-prog-name=cpp) -v/usr/include/x86_64-linux-gnu
wlnirvana

3
यदि आप चाहते हैं कि इनपुट का इंतजार न करें /dev/null, तो इनपुट को पुनर्निर्देशित करें , इसलिए `gcc -print-prog-name=cc1` -v < /dev/null
स्टीव जोर्गेनसन

@SteveJorgensen हां! या प्रेस Ctrl+ D, जो यूनिक्स-टॉक में "फ़ाइल का अंत" भेजता है।
ड्रू डॉर्मन

40

इसके अलावा, -Iविकल्प के बाद निर्दिष्ट निर्देशिकाओं में gcc दिखेगा ।



4
@ कोटा: अपने फ़ॉन्ट की जाँच करें! यह उत्तर "-I" (राजधानी "आंख") का उपयोग करता है न कि "-l" (लोअरकेस "ell") का।

3
-I <angbracketed.h> के लिए है, जबकि -iquote "quotedfiles.h" के लिए है
jcomeau_ictx

28

आप एक ऐसी फ़ाइल बना सकते हैं जिसमें बोगस सिस्टम हेडर शामिल करने का प्रयास किया गया हो। यदि आप ऐसे स्रोत पर वर्बोज़ मोड में gcc चलाते हैं, तो यह सभी सिस्टम को स्थानों को सूचीबद्ध करेगा, जैसे कि यह फर्जी हेडर के लिए दिखता है।

$ echo "#include <bogus.h>" > t.c; gcc -v t.c; rm t.c

[..]

#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i686-apple-darwin9/4.0.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.

[..]

t.c:1:32: error: bogus.h: No such file or directory

3
मुझे लगता है कि यह अधिक उपयोगी होगा यदि आपने कहा कि "-v विकल्प का उपयोग करें"।
जय कॉनरोड

यदि आप एक सी फाइल के बिना "-v" का उपयोग करते हैं जिसमें एक गैर-मौजूद सिस्टम हेडर शामिल होता है तो आप सभी शामिल रास्तों के माध्यम से इसे इकट्ठा करने का कारण नहीं बनेंगे। मेरे उत्तर की कुंजी एक सिस्टम हेडर के रूप में सूचीबद्ध है।
diciu

@ जय - तुम सही हो, यह बहुत अस्पष्ट था - मैंने समझाया है कि मैं शेल स्क्रिप्ट में क्या कर रहा था।
११:

9
अस्थायी फ़ाइलों के बिना:echo "#include <bogus.h>" | gcc -v -x c -
thejoshwolfe

2
gcc -v -E - < /dev/nullया cpp -v < /dev/nullपर्याप्त हैं आपको बस चलाने के लिए पूर्वप्रक्रमक प्राप्त करना होगा , इससे कोई फर्क नहीं पड़ता कि यह कौन सा इनपुट देखता है। (खोज पथ स्टार्टअप के दौरान मुद्रित किए जाते हैं, इससे पहले कि यह इसके इनपुट को भी देखता है।)
zwol

17

सीपीपी धारा की जीसीसी मैनुअल इंगित करता है कि शीर्ष लेख फ़ाइलें उन निर्देशिकाओं में स्थित हो सकता है:

जीसीसी हेडर के लिए कई अलग-अलग जगहों पर दिखता है। एक सामान्य यूनिक्स प्रणाली पर, यदि आप इसे अन्यथा निर्देश नहीं देते हैं, तो यह #include के साथ अनुरोध किए गए शीर्ष लेखों की तलाश करेगा:

 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include

C ++ प्रोग्राम्स के लिए, यह / usr / / / g ++ - v3, पहले भी दिखेगा।


यह gcc के आपके वर्तमान संस्करण के लिए ठीक है। वास्तविक निर्देशिका जो दिखती है वह निर्दिष्ट विकल्प पर निर्भर करती है जब gcc का निर्माण किया गया था। बेहतर समाधान के लिए शोमोप्टी उत्तर देखें।
मार्टिन यॉर्क

PS: मेरी C ++ हेडर फाइलें हैं: /usr/include/c++/4.0.0
मार्टिन

3
@ मर्टिन: आप पुराने स्कूल हैं। मेरा / in /rr/include/c++/4.2 :) में हैं
छिपकली का बिल

10

जीसीसी को निर्देशिकाओं के पूरे सेट का प्रिंट आउट प्राप्त करने के लिए, जहां यह सिस्टम हेडर के लिए दिखेगा, इसे इस तरह से लागू करें:

$ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 | 
  LC_ALL=C sed -ne '/starts here/,/End of/p'

जो फॉर्म का आउटपुट देगा

#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/5/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.

यदि आपके पास -Iकमांड लाइन पर -family विकल्प हैं तो वे प्रभावित करेंगे कि क्या प्रिंट आउट है।

(यह sedआदेश सभी अन्य कबाड़ से छुटकारा पाने के लिए है जो इस आमंत्रण को प्रिंट करता है, और यह LC_ALL=Cसुनिश्चित करने के लिए है कि sedकमांड काम करता है - "यहां शुरू होता है" और "खोज सूची का अंत" वाक्यांश IIRC अनुवादित हैं ।)


9
g++ -print-search-dirs
gcc -print-search-dirs

3
ये कमांड लिंक लाइब्रेरी और कंपाइलर के आंतरिक घटकों के लिए डिफ़ॉल्ट खोज पथ प्रिंट करते हैं; वे आपको शीर्ष लेख फ़ाइलों के बारे में कुछ नहीं बताते हैं।
zwol

6

उन रास्तों का सेट जहां हेडर फ़ाइलों के लिए कंपाइलर देखता है, कमांड द्वारा चेक किया जा सकता है: -

cpp -v

यदि आप #include "" घोषित करते हैं , तो संकलक पहले स्रोत फ़ाइल की वर्तमान निर्देशिका में खोज करता है और यदि नहीं मिला है, तो उपरोक्त पुनर्प्राप्त निर्देशिकाओं में खोज जारी है।

यदि आप # जीत की घोषणा करते हैं , तो कंपाइलर सीधे ऊपर दिए गए कमांड से प्राप्त उन निर्देशिकाओं में खोज करता है।

स्रोत: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026


1

एक (अतिरिक्त) निम्नलिखित को बाहर की जाँच करके बैश से एक सी कार्यक्रम के लिए पथ शामिल कर सकता है:

echo $C_INCLUDE_PATH

यदि यह खाली है, तो डिफ़ॉल्ट रूप से स्थान शामिल करने के लिए इसे संशोधित किया जा सकता है:

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include

1

ये निर्देशिकाएं हैं जो निर्दिष्ट हेडर फ़ाइलों के लिए डिफ़ॉल्ट रूप से जीसीसी दिखती हैं (यह देखते हुए कि हेडर फाइलें शेवरॉन में शामिल हैं <>); 1. 3 पार्टी हेडर फ़ाइलों के लिए / usr / स्थानीय / शामिल / / उपयोग किया। 2. सिस्टम हेडर फ़ाइलों के लिए उपयोग किया जाता है।

यदि मामले में आप अपनी कस्टम हैडर फ़ाइल को उपर्युक्त निर्देशिकाओं के अलावा किसी अन्य स्थान पर रखने का निर्णय लेते हैं, तो आप उन्हें निम्नानुसार शामिल कर सकते हैं: 1. शेवरॉन के बजाय फ़ाइलों के पथ के साथ उद्धरण ("./ustom_header_files/foo.h") का उपयोग करें। शामिल बयान में। 2. कोड का संकलन करते समय -I स्विच का उपयोग करना। gcc -I / home / user / custom_headers / -c foo.c -p foo.o मूल रूप से -I स्विच, -I स्विच के साथ निर्दिष्ट निर्देशिका में पहले देखने के लिए संकलक को बताता है (इससे पहले कि यह मानक निर्देशिकाओं की जाँच करता है) ।When -I स्विच का उपयोग करके हेडर फ़ाइलों को शेवरॉन का उपयोग करके शामिल किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.