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に関する他の言及はありませんcc1
でしgcc
た。
それらの関係は何ですか?このコンピュータでRubyをコンパイルできるという希望はありますか?
答え1
GCC には複数のステップのコンパイルがあり、各ステップを完了するためにさまざまな内部コマンドを使用します。特にCの場合は、まずcppで前処理し、次にアセンブリにコンパイルし、機械語にアセンブルしてから互いに接続します。
cc1は、前処理されたC言語ファイルをインポートしてアセンブリ言語に変換する内部コマンドです。 Cをコンパイルする実際の部分です。 C ++の場合、さまざまな言語のcc1plusやその他の組み込みコマンドがあります。
Wikibooksに書籍があります写真でコースを説明してください。
残念ながら、cc1は内部コマンドであり、インストールの一部にすぎません。それがすべてならコンパイルできません。
答え2
gcc
cc
ファミリのCコンパイラであるファミリの名前です。
itという単語は、cc
UNIXシステムの特定のcコンパイラの一般名でもあります。たとえば、特定のビルドスクリプトまたは設定スクリプト内で環境変数を呼び出すのは一般的ですCC
。 cを指し、必ずしも実行を意味するわけではありません。オブジェクトがコンパイルされるコンパイラです。これはしばしば「コンパイルのみ」するコンパイラを指すために使用されます。ただし、cc
fromはgcc
完成した実行可能ファイルを出力できるため、対応するリンカーを使用して最終ステップも実行できます。
この用語はcc1
しばしば「内部的に」使用されるか、GNU文書(はい)は、gcc関連ライブラリが属する言語やコンパイラに基づいて名前を付けるためにも使用されます(この場合はcc1 = cコンパイラに属します)。
実際、gcc
その言葉が何を意味するのかを尋ねるならcc1
gcc -print-prog-name=cc1
ccコンパイラのライブラリパスで応答する必要があるため、実行したいのは実際の実行ファイルではなくライブラリです。
CCがより簡単であることを覚えておいてくださいCコンパイラそして、すべてを簡素化するために、このcc1を見回すと、長い旅を始めようとしない限り、内部的に仕事がどのように機能するかを知る必要はありません。
答え3
他の人が述べたようにgcc
。cc1
これ精密cc1
および他のサブルーチン(例えば、and)は次のように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-known
出力例:
/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
答え4
cc1
これはプリプロセッサとコンパイラです。入力はCソースコード、出力はアセンブリコードです。
cc1
実行によって呼び出されるコマンドの1つ(実際には最初のコマンド)を見ることができます(構文はバージョンによって異なります)。
gcc-8 -v SOMESOURCE.c