2008-12-05 15 views
144

यूनिक्स सिस्टम पर, gcc हेडर फ़ाइलों को कहां देखता है?जीसीसी सी और सी ++ हेडर फाइलों को कहां देखता है?

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

+1

उपयोगी जानकारी रखने के लिए! इसके लिए धन्यवाद। –

उत्तर

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

यह आदेश जीसीसी जो सी ++ पूर्वप्रक्रमक यह उपयोग कर रहा है पूछता है, और फिर उस पूर्वप्रक्रमक जहां यह भी शामिल है के लिए लग रहा है पूछता है।

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

इसी तरह, सी पूर्वप्रक्रमक के लिए:

echo $C_INCLUDE_PATH 

इस हैं:

`gcc -print-prog-name=cc1` -v 
+2

इसका क्या अर्थ है? मुझे यह खोजना मुश्किल लगता है। – mijiturka

+7

@ मिजिटुरका [बैश में '(बैकक्वॉट/बैकटिक) का मतलब क्या है?] (Http://unix.stackexchange.com/questions/27428/what-does-backquote-backtick-mean-in-bash) –

+4

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

16

GCC Manual की CPP Section इंगित करता है कि शीर्ष लेख फ़ाइलें उन निर्देशिकाओं में स्थित हो सकता है:

जीसीसी हेडर के लिए कई अलग अलग स्थानों में लग रहा है।

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

सी ++ प्रोग्राम के लिए, यह भी में दिखेगा /: एक सामान्य यूनिक्स प्रणाली पर, यदि आप इसे अन्यथा हिदायत नहीं है, यह में #include साथ अनुरोध किया हेडर के लिए दिखेगा usr/include/g ++ - v3, पहले।

+0

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

+0

पीएस: मेरी सी ++ हेडर फाइलें हैं: /usr/include/c++/4.0.0 –

+2

@ मार्टिन: आप पुराने स्कूल हैं। मेरा /usr/include/c++/4.2 में है :) –

26

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


+1

धन्यवाद। जोड़ने के लिए यह अच्छी जानकारी है। –

+2

@totaam: अपना फ़ॉन्ट देखें! यह उत्तर "-आई" (पूंजी "आंख") का उपयोग नहीं करता है "-l" (लोअरकेस "ell")। –

+1

-I के लिए है, जबकि -iquote "quotedfiles.h" –

23

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

$ echo "#include <bogus.h> int main(){}" > 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 
+0

के लिए है, मुझे लगता है कि अगर आप "-v विकल्प का उपयोग करें" तो यह अधिक उपयोगी होगा। –

+0

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

+0

@Jay - आप सही हैं, यह बहुत अस्पष्ट था - मैंने समझाया है कि मैं शैल स्क्रिप्ट में क्या कर रहा था। – diciu

0

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

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include 
5

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

$ 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 - कमांड लाइन पर फ़ामली विकल्प वे मुद्रित किए गए प्रभाव को प्रभावित करेंगे।

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

1

रास्तों के सेट जहां संकलक हेडर फाइल के लिए लग रहा है आदेश द्वारा जाँच की जा सकती है: -।

सीपीपी -v

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

आप # शामिल घोषित <> हैं, उन निर्देशिकाओं उपरोक्त आदेश से प्राप्त सीधे संकलक खोज करता है।

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

0

ये हैं निर्देशिका है कि जीसीसी निर्दिष्ट हैडर फ़ाइलों के लिए डिफ़ॉल्ट (यह देखते हुए कि हेडर फाइल शेवरॉन में शामिल हैं <>) द्वारा में लग रहा है, 1./usr/local/शामिल/- तृतीय पक्ष शीर्षलेख फ़ाइलों के लिए उपयोग किया गया। 2./usr/include/- सिस्टम हेडर फ़ाइलों के लिए उपयोग किया जाता है। 1. का उपयोग कर कोट ("./custom_header_files/foo.h") फाइलों के साथ:

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

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