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をコンパイルする希望を与えますか?
GCCはコンパイルにいくつかのフェーズがあり、各フェーズを実行するために異なる内部コマンドを使用します。特にCは、まずcppで前処理されてから、Assemblyにコンパイルされ、機械語にアセンブルされて、リンクされます。
cc1は、前処理されたC言語ファイルを受け取り、それらをアセンブリに変換する内部コマンドです。これは、Cをコンパイルする実際の部分です。C++の場合、cc1plusや、さまざまな言語用の他の内部コマンドがあります。
写真でプロセスを説明する の本がウィキブックスにあります。
残念ながら、cc1は内部コマンドであり、インストールの一部にすぎません。それだけだと、コンパイルできなくなります。
gcc
はスイートの名前ですcc
はこのスイートのCコンパイラです。
word cc
は、Unixシステムでの特定のcコンパイラの総称でもあります。たとえば、特定のビルドスクリプトまたは構成スクリプトでCC
という環境変数が見つかることは珍しくありません。この変数は通常、コンパイルされたオブジェクトのリンクを必ずしも実行する必要がないCコンパイラを指します。通常、「ただ」コンパイルするコンパイラを参照するために使用されます。ただし、cc
のgcc
は、完成した実行可能ファイルを出力できるため、リンカーを使用してこの最後の手順を実行することもできます。
言葉 cc1
「内部で」頻繁に使用されるか、GNU docs( example )を読み取るときに、言語またはコンパイラに基づいてgcc関連のライブラリに名前を付けるためにも使用されますに属します(この場合、cc1 = cコンパイラに属します)。
gcc
と尋ねた場合、事実は単語の意味cc1
gcc -print-prog-name=cc1
ccコンパイラのライブラリのパスで応答する必要があるため、実際の実行可能ファイルではなく、ライブラリであるものを実行しようとしています。
cCをcコンパイラとして覚えてすべてを簡略化し、このcc1をバイパスする方がはるかに簡単です。内部でどのように機能するかを知る必要はありません。長い旅を始める。
他の人が述べたように、gcc
はcc1
を使用します。
exactcc1
および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に渡されるコマンドラインオプションは、サブプロセスの呼び出し方法を間接的に変更します。しかし、スペックファイルを操作すると、柔軟性が高まり、コマンドラインオプションでは実行できないことを実行できます。 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