Cc1 और gcc के बीच संबंध?


23

मैं लिनक्स सर्वर (रूट एक्सेस के बिना) पर अपने घर निर्देशिका में रूबी को स्थापित करने की कोशिश कर रहा हूं, जो निश्चित रूप से उपयोग करने की आवश्यकता है gcc। निकटतम चीज़ जो मुझे मिल सकती है, उस नाम से एक निर्देशिका है (यदि आप काफी गहराई तक जाते हैं) इसमें शामिल हैं cc1:

>: find / -iname gcc 2> /dev/null
/usr/libexec/gcc


>: tree -if /usr/libexec/gcc
/usr/libexec/gcc
/usr/libexec/gcc/x86_64-redhat-linux
/usr/libexec/gcc/x86_64-redhat-linux/4.1.1
/usr/libexec/gcc/x86_64-redhat-linux/4.1.1/cc1
/usr/libexec/gcc/x86_64-redhat-linux/4.1.2 -> 4.1.1

तथ्य यह है कि विकिपीडिया पर जीसीसी के लिए CC1 रीडायरेक्ट पहचान के लिए कुछ पास यह सूचित करते हैं लगता है, लेकिन वहाँ पुनर्निर्देशन के बारे में टिप्पणी के अलावा जीसीसी पृष्ठ पर CC1 का कोई अन्य उल्लेख है, और Googling मुझे कुछ भी उपयोगी मिल नहीं किया है और उपयोग करने के लिए अपने प्रयास cc1में जगह gccविफल रहे हैं।

वास्तव में उनके बीच क्या संबंध है? और क्या यह मुझे इस मशीन पर रूबी को संकलित करने की कोई उम्मीद प्रदान करता है?

जवाबों:


28

जीसीसी के पास इसके संकलन के लिए कई चरण हैं, और यह प्रत्येक चरण को करने के लिए विभिन्न आंतरिक कमांड का उपयोग करता है। C विशेष रूप से पहले cpp के साथ प्रीप्रोसेस किया जाता है, फिर असेंबली में संकलित किया जाता है, मशीन भाषा में इकट्ठा किया जाता है, और फिर एक साथ जोड़ा जाता है।

cc1 आंतरिक कमांड है जो पूर्व-सी सी-भाषा फ़ाइलों को लेता है और उन्हें असेंबली में रूपांतरित करता है। यह वास्तविक भाग है जो C ++ के लिए C को संकलित करता है, cc1plus है, और विभिन्न भाषाओं के लिए अन्य आंतरिक कमांड हैं।

विकीबूक पर एक किताब है जो चित्रों के साथ प्रक्रिया की व्याख्या करती है

दुर्भाग्य से, cc1 एक आंतरिक कमांड है और इंस्टॉलेशन का केवल एक टुकड़ा है, और यदि यह सब आपके पास है, तो आप चीजों का अनुपालन नहीं कर पाएंगे।


2
सामान्य शब्द "फ्रंट एंड" है।
कीथ थॉम्पसन

1
क्या आप सुनिश्चित हैं कि इसके लिए पूर्व-सी फ़ाइलों की आवश्यकता है? मैं cc1फ़ाइलों #includeऔर #defineनिर्देशों के साथ सक्षम होने लगता हूं
एक्सट्रीमेक्स 5

10

gccसुइट ccका नाम इस सुइट से सिर्फ C कंपाइलर है।

यह शब्द ccयूनिक्स सिस्टम के तहत किसी भी दिए गए सी कंपाइलर के लिए भी एक सामान्य नाम है, उदाहरण के लिए किसी दिए CCगए भवन की स्क्रिप्ट या कॉन्फिगर स्क्रिप्ट में पर्यावरण चर को खोजना दुर्लभ नहीं है , और यदि आप पांडित्यपूर्ण होना चाहते हैं, तो यह चर आमतौर पर एसी को इंगित करता है संकलक जो आपके संकलित ऑब्जेक्ट के लिंकिंग को अनिवार्य रूप से नहीं करता है, यह आमतौर पर एक संकलक को संदर्भित करता है जो "बस" संकलन करता है। ccसे gccहै, तथापि, उत्पादन करने में सक्षम है जो पूर्ण निष्पादन योग्य तो भी इसके संयोजक के साथ इस अंतिम चरण के प्रदर्शन करने में सक्षम है।

यह शब्द cc1अक्सर "आंतरिक रूप से" या GNU डॉक्स ( उदाहरण ) को पढ़ते समय उपयोग किया जाता है , इसका उपयोग gcc से संबंधित लाइब्रेरी को यह बताने के लिए भी किया जाता है कि वे किस भाषा या संकलक के आधार पर हैं (इस मामले में cc1 = c संकलक के हैं)।

यदि आप पूछते हैं gccकि शब्द का अर्थ क्या हैcc1

gcc -print-prog-name=cc1

यह cc संकलक के लिए पुस्तकालय के लिए पथ के साथ उत्तर देना चाहिए, इसलिए आप कुछ ऐसा निष्पादित करने का प्रयास कर रहे हैं जो एक पुस्तकालय है और वास्तविक निष्पादन योग्य नहीं है।

CC संकलक के रूप में CC को याद रखना और सब कुछ सरल करना बहुत सरल है , इस cc1 को दरकिनार करते हुए, आपको यह जानने की आवश्यकता नहीं है कि जब तक आप एक लंबी यात्रा शुरू नहीं करना चाहते तब तक चीजें आंतरिक रूप से कैसे काम करती हैं।


4

जैसा कि दूसरों ने उल्लेख किया है, gccउपयोग करता है cc1

सटीक जिसमें तरह से cc1और अन्य उप प्रोग्राम की तरह cppऔर ldकहा जाता है किया जाता है से निर्धारित होता है कल्पना फ़ाइलें प्रारूप।

वर्तमान युक्ति फ़ाइल को इसके साथ देखा जा सकता है:

gcc -dumpspecs

संबंधित अनुभाग लगता है:

*cc1_options:
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %{!iplugindir*:%{fplugin*:%:find-plugindir()}} %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{aux-info*} %{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)}  %{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}}  %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{Qy:} %{-help:--help} %{-target-help:--target-help} %{-version:--version} %{-help=*:--help=%*} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{coverage:-fprofile-arcs -ftest-coverage}

और आप अपनी स्वयं की कल्पना फ़ाइल का उपयोग कर सकते हैं:

gcc -specs=<specs-file>

बेशक, जीसीसी को पारित कमांड लाइन विकल्प अप्रत्यक्ष रूप से बदलते हैं कि उप-प्रक्रियाओं को कैसे कहा जाता है। लेकिन कल्पना फ़ाइलों में हेरफेर करने से आपको अधिक लचीलापन मिलता है और आप उन चीजों को करने की अनुमति देते हैं जो कमांड लाइन विकल्प नहीं कर सकते हैं, उदाहरण के लिए /programming/7493620/inhibit-default-library-paths-with-gcc

आप देख सकते हैं कि क्या आसानी से चलाया जा रहा है:

gcc -v hello_world.c |& grep cc1

नमूना उत्पादन:

/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -quiet -v -imultiarch x86_64-linux-gnu hello_world.c -quiet -dumpbase hello_world.c -mtune=generic -march=x86-64 -auxbase hello_world -version -fstack-protector -Wformat -Wformat-security -o /tmp/ccvcVNAX.s

1

cc1 प्रीप्रोसेसर और कंपाइलर दोनों है, जिसका इनपुट C सोर्स कोड है और आउटपुट असेंबली कोड है।

आप देख सकते हैं cc1कि आदेशों में से एक आदेश दिया गया है (पहला, वास्तव में) जारी करके (संस्करण पर निर्भर सिंटैक्स):
gcc-8 -v SOMESOURCE.c

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