gcc / g ++: "ऐसी कोई फ़ाइल या निर्देशिका नहीं"


87

g++ मुझे फॉर्म की त्रुटियां देता है:

foo.cc:<line>:<column>: fatal error: <bar>: No such file or directory
compilation terminated.

C- प्रोग्राम्स को कंपाइल करते समय भी ऐसा ही होता है gcc

ऐसा क्यों है?


कृपया ध्यान दें: यह प्रश्न पहले भी कई बार पूछा जा चुका है, लेकिन हर बार यह पूछने वालों की स्थिति के लिए विशिष्ट था। इस सवाल का उद्देश्य एक सवाल है कि दूसरों को एक बार और सभी के डुप्लिकेट के रूप में बंद किया जा सकता है ; एक अकसर किये गए सवाल


4
एफएक्यू के अलावा अच्छा है। धन्यवाद!
एसबीआइ

जवाबों:


117

आपके कंपाइलर ने केवल नाम की फ़ाइल संकलित करने का प्रयास किया foo.cc। लाइन नंबर मारने पर line, संकलक पाता है:

#include "bar"

या

#include <bar>

कंपाइलर फिर उस फाइल को खोजने की कोशिश करता है। इसके लिए, यह देखने के लिए निर्देशिकाओं के एक सेट का उपयोग करता है, लेकिन इस सेट के भीतर, कोई फ़ाइल नहीं है bar। शामिल विवरण के संस्करणों के बीच अंतर की व्याख्या के लिए यहां देखें

कंपाइलर को कैसे बताएं कि उसे कहां खोजना है

g++एक विकल्प है -I। यह आपको कमांड लाइन में खोज पथ शामिल करने देता है। कल्पना करें कि आपकी फ़ाइल barएक फ़ोल्डर में है जिसका नाम frobnicate, सापेक्ष है foo.cc(मान लें कि आप उस निर्देशिका से संकलित कर रहे हैं जहां foo.ccस्थित है):

g++ -Ifrobnicate foo.cc

आप अधिक शामिल-पथ जोड़ सकते हैं; आपके द्वारा दिया गया प्रत्येक वर्तमान निर्देशिका के सापेक्ष है। Microsoft के कंपाइलर में एक सहसंबंधी विकल्प होता है /Iजो उसी तरह काम करता है, या विज़ुअल स्टूडियो में, कॉन्फ़िगरेशन गुण-> C / C ++ -> सामान्य-> अतिरिक्त शामिल निर्देशिकाएँ के तहत प्रोजेक्ट के प्रॉपर्टी पेज में फ़ोल्डर्स सेट किए जा सकते हैं।

अब कल्पना कीजिए कि आपके पास barविभिन्न फ़ोल्डरों के कई संस्करण दिए गए हैं:


// A/bar
#include<string>
std::string which() { return "A/bar"; }

// B/bar
#include<string>
std::string which() { return "B/bar"; }

// C/bar
#include<string>
std::string which() { return "C/bar"; }

// foo.cc
#include "bar"
#include <iostream>

int main () {
    std::cout << which() << std::endl;
}

प्राथमिकता #include "bar"सबसे बाईं ओर है:

$ g++ -IA -IB -IC foo.cc
$ ./a.out
A/bar

जैसा कि आप देख रहे हैं, जब संकलक ने देखना शुरू किया A/, B/और C/, यह पहली या सबसे बाईं ओर रुका।

यह दोनों रूपों का सच है, include <>और incude ""

#include <bar>और के बीच अंतर#include "bar"

आमतौर पर, #include <xxx>यह पहले सिस्टम फोल्डर में दिखता है , यह इसे पहले #include "xxx"करंट या कस्टम फोल्डर में देखता है।

उदाहरण के लिए:

कल्पना करें कि आपके प्रोजेक्ट फ़ोल्डर में निम्नलिखित फाइलें हैं:

list
main.cc

साथ main.cc:

#include "list"
....

इसके लिए, आपका कंपाइलर आपके प्रोजेक्ट फ़ोल्डर में #includeफ़ाइल करेगा list, क्योंकि यह वर्तमान में संकलित है main.ccऔर listवर्तमान फ़ोल्डर में वह फ़ाइल है।

लेकिन इसके साथ main.cc:

#include <list>
....

और फिर g++ main.cc, आपका कंपाइलर सबसे पहले सिस्टम फोल्डर में दिखेगा, और क्योंकि <list>यह एक मानक हेडर है, यह #includeफाइल का नाम होगा जो listआपके सी ++ प्लेटफॉर्म के साथ मानक लाइब्रेरी के हिस्से के रूप में आता है।

यह सब थोड़ा सरल है, लेकिन आपको मूल विचार देना चाहिए।

<>/ ""-Pyerities और पर विवरण-I

Gcc-प्रलेखन के अनुसार , प्राथमिकता include <>"सामान्य यूनिक्स प्रणाली" पर है, इस प्रकार है:

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

सी ++ कार्यक्रमों के लिए, यह पहले / usr / / / c ++ / संस्करण में भी दिखेगा। उपरोक्त में, लक्ष्य उस प्रणाली का विहित नाम है जिसे GCC कोड के लिए संकलित करने के लिए कॉन्फ़िगर किया गया था; [...]।

प्रलेखन में यह भी कहा गया है:

आप -Idir कमांड लाइन विकल्प के साथ इस सूची में जोड़ सकते हैं। डिफ़ॉल्ट निर्देशिकाओं से पहले , मैं -I द्वारा नामित सभी निर्देशिकाओं को बाएं से दाएं क्रम में खोजा जाता है । एकमात्र अपवाद तब होता है जब dir पहले से ही डिफ़ॉल्ट रूप से खोजा जाता है। इस स्थिति में, विकल्प को अनदेखा कर दिया जाता है और सिस्टम निर्देशिकाओं के लिए खोज क्रम अपरिवर्तित रहता है।

हमारे #include<list> / #include"list"उदाहरण को जारी रखने के लिए (समान कोड):

g++ -I. main.cc

तथा

#include<list>
int main () { std::list<int> l; }

और वास्तव में, सिस्टम में -I.फ़ोल्डर को प्राथमिकता दी जाती है .और हमें एक कंपाइलर त्रुटि मिलती है।


9
बस आपको यह नोटिस करना है कि यह थोड़े अजीब है कि आप अपने कंपाइलर को "अपने कंपाइलर" के रूप में देखें क्योंकि प्रश्न और उत्तर में एक ही लेखक है।
जूता

27
@ जेफ्री: हो सकता है कि प्रश्न के लेखक का इरादा यहां सामान्य प्रारूप के अनुकूल हो। डन्नो, उससे पूछो।
सेबेस्टियन मच

1
यह उत्तर गलत है, डिफ़ॉल्ट सिस्टम डायर से पहले #include <>सूचीबद्ध डायर में दिखता है-I
जोनाथन वैक्ली

5
" कल्पना करें कि आपकी फ़ाइल बार frobnicate नामक फ़ोल्डर में है, foo.cc के सापेक्ष " dirs के साथ दिए गए -Iडायर के सापेक्ष हैं जहां आप gcc चलाते हैं, फ़ाइल संकलित होने के सापेक्ष नहीं। अंतर महत्वपूर्ण है अगर आप करते हैंg++ -Ifrobnicate blah/foo.cc
जोनाथन वेकली

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