ความสัมพันธ์ระหว่าง 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 เพื่อ GCC ในวิกิพีเดียดูเหมือนจะบ่งบอกอะไรบางอย่างที่ใกล้เคียงกับตัวตน แต่ไม่มีการพูดถึงคนอื่น ๆ ของ CC1 บนหน้า GCC นอกจากหมายเหตุเกี่ยวกับการเปลี่ยนเส้นทางและ Googling ไม่ได้อากาศผมอะไรที่เป็นประโยชน์และความพยายามของฉันกับการใช้งานcc1ใน สถานที่ของgccมีการล้มเหลว

ความสัมพันธ์ระหว่างพวกเขาคืออะไรกันแน่? และมันทำให้ฉันมีความหวังในการรวบรวมทับทิมบนเครื่องนี้หรือไม่?

คำตอบ:


28

GCC มีจำนวนเฟสในการรวบรวมและใช้คำสั่งภายในที่แตกต่างกันในการทำแต่ละเฟส โดยเฉพาะอย่างยิ่ง C จะถูกประมวลผลล่วงหน้าด้วย cpp ก่อนจากนั้นจะรวบรวมเป็นชุดประกอบประกอบเป็นภาษาเครื่องแล้วเชื่อมโยงเข้าด้วยกัน

cc1 เป็นคำสั่งภายในที่ใช้ไฟล์ C-language ที่ประมวลผลล่วงหน้าแล้วและแปลงเป็นแอสเซมบลี มันเป็นส่วนที่เกิดขึ้นจริงซึ่งรวบรวม C สำหรับ C ++ มี cc1plus และคำสั่งภายในอื่น ๆ สำหรับภาษาต่างๆ

มีหนังสือเกี่ยวกับวิกิพีเดียที่เป็นอธิบายกระบวนการที่มีรูปภาพ

น่าเสียดายที่ cc1 เป็นคำสั่งภายในและการติดตั้งเพียงชิ้นเดียวและถ้านั่นคือทั้งหมดที่คุณมีคุณจะไม่สามารถรวบรวมสิ่งต่าง ๆ ได้


2
คำปกติคือ "ส่วนหน้า"
Keith Thompson

1
คุณแน่ใจหรือว่าต้องการไฟล์ C ที่ประมวลผลล่วงหน้า ฉันดูเหมือนจะสามารถใช้cc1ไฟล์#includeและ#defineคำสั่งได้
Extremeaxe5

10

gccเป็นชื่อของชุดccเป็นเพียงคอมไพเลอร์ C จากชุดนี้

คำccนี้ยังเป็นชื่อสามัญสำหรับคอมไพเลอร์ c ใด ๆ ที่ได้รับภายใต้ระบบยูนิกซ์เช่นมันไม่ยากที่จะหาตัวแปรสภาพแวดล้อมที่เรียกว่าCCสคริปต์สร้างหรือกำหนดค่าสคริปต์และหากคุณต้องการ pedantic ตัวแปรนี้มักชี้ไปที่ ac คอมไพเลอร์ที่ไม่จำเป็นต้องทำการเชื่อมโยงวัตถุที่คอมไพล์ของคุณโดยปกติจะใช้เพื่ออ้างถึงคอมไพเลอร์ที่คอมไพล์ "เพิ่ง" อย่างไรก็ตามccจากgccคือสามารถส่งออกไฟล์ปฏิบัติการที่เสร็จสิ้นแล้วดังนั้นจึงสามารถทำขั้นตอนสุดท้ายนี้กับตัวเชื่อมโยงได้

คำที่cc1ใช้บ่อยครั้งคือ "ภายใน" หรือเมื่ออ่านเอกสาร GNU ( ตัวอย่าง ) มันยังใช้เพื่อตั้งชื่อไลบรารีที่เกี่ยวข้องกับ gcc ตามภาษาหรือคอมไพเลอร์ที่พวกเขาอยู่ (ในกรณีนี้ cc1 = เป็นของคอมไพเลอร์ c)

ถ้าคุณถามgccสิ่งที่มีความหมายของคำcc1

gcc -print-prog-name=cc1

ควรตอบด้วยพา ธ สำหรับไลบรารีสำหรับคอมไพเลอร์ซีซีดังนั้นคุณพยายามที่จะดำเนินการบางอย่างที่เป็นไลบรารี่และไม่สามารถเรียกใช้งานได้จริง

มันง่ายกว่ามากในการจดจำ CC ในฐานะคอมไพเลอร์และทำให้ทุกอย่างง่ายขึ้นข้าม CC1 นี้คุณไม่จำเป็นต้องรู้ว่าสิ่งต่าง ๆ ทำงานอย่างไรภายในถ้าคุณต้องการเริ่มการเดินทางที่ยาวนาน


4

เป็นคนอื่น ๆ ที่กล่าวถึงการใช้งานgcccc1

แน่นอนวิธีที่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>

แน่นอนว่าตัวเลือกบรรทัดคำสั่งที่ส่งผ่านไปยัง GCC เปลี่ยนวิธีการเรียกกระบวนการย่อยทางอ้อม แต่การจัดการไฟล์ข้อมูลจำเพาะจะช่วยให้คุณมีความยืดหยุ่นมากขึ้นและช่วยให้คุณทำสิ่งที่ตัวเลือกบรรทัดคำสั่งไม่สามารถทำได้เช่น/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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.