यूनिक्स प्रणाली पर, शीर्ष लेख फ़ाइलों के लिए gcc कहाँ दिखता है?
मैंने आज सुबह कुछ सिस्टम हेडर फ़ाइलों की तलाश में थोड़ा समय बिताया, इसलिए मुझे लगा कि यह अच्छी जानकारी होगी।
यूनिक्स प्रणाली पर, शीर्ष लेख फ़ाइलों के लिए gcc कहाँ दिखता है?
मैंने आज सुबह कुछ सिस्टम हेडर फ़ाइलों की तलाश में थोड़ा समय बिताया, इसलिए मुझे लगा कि यह अच्छी जानकारी होगी।
जवाबों:
`gcc -print-prog-name=cc1plus` -v
यह कमांड gcc से पूछता है कि यह कौन सी C + प्रीप्रोसेसर का उपयोग कर रहा है, और फिर उस प्रीप्रोसेसर को पूछता है जिसमें यह शामिल है।
आपको अपने विशिष्ट सेटअप के लिए एक विश्वसनीय उत्तर मिलेगा।
इसी तरह, सी प्रीप्रोसेसर के लिए:
`gcc -print-prog-name=cpp` -v
cpp
cc1
$(gcc -print-prog-name=cpp) -v
/usr/include/x86_64-linux-gnu
/dev/null
, तो इनपुट को पुनर्निर्देशित करें , इसलिए `gcc -print-prog-name=cc1` -v < /dev/null
।
Ctrl
+ D
, जो यूनिक्स-टॉक में "फ़ाइल का अंत" भेजता है।
इसके अलावा, -I
विकल्प के बाद निर्दिष्ट निर्देशिकाओं में gcc दिखेगा ।
आप एक ऐसी फ़ाइल बना सकते हैं जिसमें बोगस सिस्टम हेडर शामिल करने का प्रयास किया गया हो। यदि आप ऐसे स्रोत पर वर्बोज़ मोड में 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
echo "#include <bogus.h>" | gcc -v -x c -
gcc -v -E - < /dev/null
या cpp -v < /dev/null
पर्याप्त हैं आपको बस चलाने के लिए पूर्वप्रक्रमक प्राप्त करना होगा , इससे कोई फर्क नहीं पड़ता कि यह कौन सा इनपुट देखता है। (खोज पथ स्टार्टअप के दौरान मुद्रित किए जाते हैं, इससे पहले कि यह इसके इनपुट को भी देखता है।)
सीपीपी धारा की जीसीसी मैनुअल इंगित करता है कि शीर्ष लेख फ़ाइलें उन निर्देशिकाओं में स्थित हो सकता है:
जीसीसी हेडर के लिए कई अलग-अलग जगहों पर दिखता है। एक सामान्य यूनिक्स प्रणाली पर, यदि आप इसे अन्यथा निर्देश नहीं देते हैं, तो यह #include के साथ अनुरोध किए गए शीर्ष लेखों की तलाश करेगा:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
C ++ प्रोग्राम्स के लिए, यह / usr / / / g ++ - v3, पहले भी दिखेगा।
जीसीसी को निर्देशिकाओं के पूरे सेट का प्रिंट आउट प्राप्त करने के लिए, जहां यह सिस्टम हेडर के लिए दिखेगा, इसे इस तरह से लागू करें:
$ 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 अनुवादित हैं ।)
g++ -print-search-dirs
gcc -print-search-dirs
उन रास्तों का सेट जहां हेडर फ़ाइलों के लिए कंपाइलर देखता है, कमांड द्वारा चेक किया जा सकता है: -
cpp -v
यदि आप #include "" घोषित करते हैं , तो संकलक पहले स्रोत फ़ाइल की वर्तमान निर्देशिका में खोज करता है और यदि नहीं मिला है, तो उपरोक्त पुनर्प्राप्त निर्देशिकाओं में खोज जारी है।
यदि आप # जीत की घोषणा करते हैं , तो कंपाइलर सीधे ऊपर दिए गए कमांड से प्राप्त उन निर्देशिकाओं में खोज करता है।
स्रोत: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026
एक (अतिरिक्त) निम्नलिखित को बाहर की जाँच करके बैश से एक सी कार्यक्रम के लिए पथ शामिल कर सकता है:
echo $C_INCLUDE_PATH
यदि यह खाली है, तो डिफ़ॉल्ट रूप से स्थान शामिल करने के लिए इसे संशोधित किया जा सकता है:
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
ये निर्देशिकाएं हैं जो निर्दिष्ट हेडर फ़ाइलों के लिए डिफ़ॉल्ट रूप से जीसीसी दिखती हैं (यह देखते हुए कि हेडर फाइलें शेवरॉन में शामिल हैं <>); 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 स्विच का उपयोग करके हेडर फ़ाइलों को शेवरॉन का उपयोग करके शामिल किया जा सकता है।