Mối quan hệ giữa cc1 và gcc?


23

Tôi đang cố gắng cài đặt Ruby trong thư mục nhà của tôi trên máy chủ Linux (không có quyền truy cập root), tất nhiên cần phải sử dụng gcc. Thứ gần nhất tôi có thể tìm thấy là một thư mục có tên đó (nếu bạn đi đủ sâu) chứa 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

Thực tế là CC1 chuyển hướng GCC trên Wikipedia dường như ngụ ý một cái gì đó gần gũi với bản sắc, tuy nhiên không có đề cập đến khác của CC1 trên trang GCC bên cạnh những lưu ý về chuyển hướng, và Googling đã không nhận tôi bất cứ điều gì hữu ích, và những nỗ lực của tôi để sử dụng cc1trong nơi gccđã thất bại.

Chính xác thì mối quan hệ giữa họ là gì? Và nó có cung cấp cho tôi bất kỳ hy vọng biên dịch Ruby trên máy này không?

Câu trả lời:


28

GCC có một số giai đoạn để biên dịch và nó sử dụng các lệnh nội bộ khác nhau để thực hiện từng giai đoạn. C nói riêng được xử lý trước bằng cpp, sau đó được biên dịch thành cụm, lắp ráp thành ngôn ngữ máy và sau đó được liên kết với nhau.

cc1 là lệnh nội bộ lấy các tệp ngôn ngữ C được xử lý trước và chuyển đổi chúng thành assembly. Đây là phần thực tế biên dịch C. Đối với C ++, có cc1plus và các lệnh nội bộ khác cho các ngôn ngữ khác nhau.

Có một cuốn sách trên Wikibooks giải thích quá trình bằng hình ảnh .

Thật không may, cc1 là một lệnh nội bộ và chỉ có một phần cài đặt và nếu đó là tất cả những gì bạn có, bạn sẽ không thể biên dịch mọi thứ.


2
Thuật ngữ thông thường là "kết thúc trước".
Keith Thompson

1
Bạn có chắc chắn rằng nó yêu cầu các tệp C được xử lý trước? Tôi dường như có thể gửi cc1các tệp #include#definechỉ thị
extremeaxe5

10

gcclà tên của bộ ccchỉ là trình biên dịch C từ bộ này.

từ ccnày cũng là một tên chung cho bất kỳ trình biên dịch c cụ thể nào trong các hệ thống unix, ví dụ, không hiếm khi tìm thấy một biến môi trường được gọi CCtrong một tập lệnh xây dựng cụ thể hoặc tập lệnh cấu hình và nếu bạn muốn là mô phạm, thì biến này thường trỏ đến ac trình biên dịch không nhất thiết phải thực hiện liên kết đối tượng được biên dịch của bạn, nó thường được sử dụng để chỉ một trình biên dịch "chỉ" biên dịch. cctừ gcclà, tuy nhiên, có khả năng sản lượng thực thi thành như vậy là có thể thực hiện bước cuối cùng này với mối liên kết của nó quá.

từ cc1mà nó thường được sử dụng "bên trong" hoặc khi đọc tài liệu GNU ( ví dụ ), nó cũng được sử dụng để đặt tên thư viện liên quan đến gcc dựa trên ngôn ngữ hoặc trình biên dịch mà chúng thuộc về (trong trường hợp này cc1 = thuộc về trình biên dịch c).

nguyên vẹn nếu bạn hỏi gccnghĩa của từ này là gìcc1

gcc -print-prog-name=cc1

nó sẽ trả lời với đường dẫn của thư viện cho trình biên dịch cc, vì vậy bạn đang cố thực thi một cái gì đó là một thư viện chứ không phải là một tệp thực thi thực sự.

Thật đơn giản để nhớ CC là trình biên dịch c và đơn giản hóa mọi thứ, bỏ qua cc1 này, bạn không cần phải biết cách mọi thứ hoạt động bên trong trừ khi bạn muốn bắt đầu một hành trình dài.


4

Như những người khác đã đề cập, gccsử dụng cc1.

Cách chính xác trong đó cc1và các chương trình con khác thích cppldđược gọi được thực hiện được xác định bởi định dạng tệp spec .

Tệp spec hiện tại có thể được xem với:

gcc -dumpspecs

Phần có liên quan dường như là:

*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}

Và bạn có thể sử dụng tệp spec của riêng bạn với:

gcc -specs=<specs-file>

Tất nhiên, các tùy chọn dòng lệnh được truyền cho GCC gián tiếp thay đổi cách gọi các quy trình con. Nhưng thao tác với các tệp spec cung cấp cho bạn tính linh hoạt cao hơn và cho phép bạn thực hiện những điều mà tùy chọn dòng lệnh không thể, ví dụ: /programming/7493620/inhibit-default-l Library-path-with-gcc

Bạn có thể quan sát những gì đang được chạy dễ dàng với:

gcc -v hello_world.c |& grep cc1

Đầu ra mẫu:

/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 vừa là bộ tiền xử lý vừa là trình biên dịch, có đầu vào là mã nguồn C và đầu ra là mã lắp ráp.

Bạn có thể thấy cc1là một trong những lệnh được gọi (đầu tiên, trên thực tế) bằng cách ban hành (cú pháp phụ thuộc vào phiên bản):
gcc-8 -v SOMESOURCE.c

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.