web-dev-qa-db-ja.com

cc1とgccの関係は?

Linuxサーバーのホームディレクトリに(ルートアクセスなしで)Ruby)をインストールしようとしていますが、もちろん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がWikipediaのGCCにリダイレクトする という事実は、アイデンティティに近いものを示唆しているようですが、GCCページにはリダイレクトに関する注記以外にCC1についての言及はなく、グーグルによって私に役立つものは何もありません、およびgccの代わりにcc1を使用しようとすると失敗しました。

それらの間の正確な関係は何ですか?そして、それは私にこのマシンでRubyをコンパイルする希望を与えますか?

24
iconoclast

GCCはコンパイルにいくつかのフェーズがあり、各フェーズを実行するために異なる内部コマンドを使用します。特にCは、まずcppで前処理されてから、Assemblyにコンパイルされ、機械語にアセンブルされて、リンクされます。

cc1は、前処理されたC言語ファイルを受け取り、それらをアセンブリに変換する内部コマンドです。これは、Cをコンパイルする実際の部分です。C++の場合、cc1plusや、さまざまな言語用の他の内部コマンドがあります。

写真でプロセスを説明する の本がウィキブックスにあります。

残念ながら、cc1は内部コマンドであり、インストールの一部にすぎません。それだけだと、コンパイルできなくなります。

29
Alan Shutko

gccはスイートの名前ですccはこのスイートのCコンパイラです。

word ccは、Unixシステムでの特定のcコンパイラの総称でもあります。たとえば、特定のビルドスクリプトまたは構成スクリプトでCCという環境変数が見つかることは珍しくありません。この変数は通常、コンパイルされたオブジェクトのリンクを必ずしも実行する必要がないCコンパイラを指します。通常、「ただ」コンパイルするコンパイラを参照するために使用されます。ただし、ccgccは、完成した実行可能ファイルを出力できるため、リンカーを使用してこの最後の手順を実行することもできます。

言葉 cc1「内部で」頻繁に使用されるか、GNU docs( example )を読み取るときに、言語またはコンパイラに基づいてgcc関連のライブラリに名前を付けるためにも使用されますに属します(この場合、cc1 = cコンパイラに属します)。

gccと尋ねた場合、事実は単語の意味cc1

gcc -print-prog-name=cc1

ccコンパイラのライブラリのパスで応答する必要があるため、実際の実行可能ファイルではなく、ライブラリであるものを実行しようとしています。

cCをcコンパイラとして覚えてすべてを簡略化し、このcc1をバイパスする方がはるかに簡単です。内部でどのように機能するかを知る必要はありません。長い旅を始める。

10
user2384250

他の人が述べたように、gcccc1を使用します。

exactcc1およびcppldなどの他のサブプログラムが呼び出される方法は、完了は スペックファイル 形式で決定されます。

現在のスペックファイルは次のように表示できます。

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に渡されるコマンドラインオプションは、サブプロセスの呼び出し方法を間接的に変更します。しかし、スペックファイルを操作すると、柔軟性が高まり、コマンドラインオプションでは実行できないことを実行できます。 https://stackoverflow.com/questions/7493620/inhibit-default-library-paths-with-gcc

何が実行されているかを簡単に確認できます。

gcc -v hello_world.c |& grep cc1

で述べたように https://stackoverflow.com/questions/40572041/how-to-make-gcc-show-the-internal-commands-called

出力例:

/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

cc1はプリプロセッサとコンパイラの両方であり、入力はCソースコード、出力はアセンブリコードです。

あなたは見ることができますcc1は、(バージョンに依存する構文)を発行することによって呼び出されるコマンドの1つです(実際、最初のコマンドです)。
gcc-8 -v SOMESOURCE.c

1
flow2k