4

私はGCCコンパイラとGeany(違いがあればArch Linux)でCを学んでいます。ただし、Geanyとインターネットの両方で、コンパイルとビルドという言葉が同じ意味で使用されているのを目にしています。グーグルで混乱しているだけなので、コンパイルプロセスを理解する方法が正しいことを明確にしてほしいと思います。

単純なhelloworld.cファイルを作成するとします。

#include <stdio.h>
int main(void)
{
    printf("Hello world!");
    return 0;
}

を実行するgcc -c helloworld.cと、コンパイラはhelloworld.oオブジェクトファイルを生成します。Geanyはこのプロセスをコンパイルと呼び、コンパイラはCompilation finished successfully.

ここで、を実行するgcc -o helloworld helloworld.cと、コンパイラはという実行可能ファイルを生成し、helloworldGeanyはそれをbuildingと呼びます。しかし、コンパイラは再び言いますCompilation finished successfully.

-cオプションを使用するとオブジェクトファイルが生成され、これらの複数をライブラリとリンクして実行可能ファイルを生成できることは理解していますが、どのシナリオがコンパイルで、どのシナリオがビルドされているかについて混乱しています。

さらに、プロジェクトに1つのhelloworld.cファイルなどのソースファイルが1つしかない場合gcc -o helloworld helloworld.c、ソースコードを実行可能ファイルに変換するのに十分ですか?

ありがとう

4

3 に答える 3

3

2 番目の質問に答えるには: はい、問題gcc -o myprog myprog.cありません。gcc -o myprog *.cや もそうですgcc -o myprog foo.c bar.c baz.c

あなたの最初の質問に答えるために: 技術的に言えば、「構築」という言葉はありません:) しかし、「構築」と「コンパイル」という言葉は、ソースコードから最終的な実行可能ファイルを生成するプロセス全体を表すために同じ意味で使用できます。

より正確なコンテキストでは、次のようになります。

  • プリプロセッサがヘッダー ファイルをインクルードしたり、マクロを展開したりする場合の前処理。
  • 構文解析では、パーサーがソース テキストをトークン化し、プログラム フローの構造化データ モデル (いわゆる抽象構文ツリー) を生成します。
  • コンパイルまたはコンパイル (コード ジェネレーターが AST をトラバースし、そこからアセンブリ コードを生成する場合)
  • アセンブル: コンパイラ ドライバがアセンブリ テキストをバイナリ オブジェクト コードに変換するアセンブラ プログラムを呼び出し、最後に
  • リンクまたはリンケージ、コンパイラ ドライバがリンカを呼び出してライブラリ内のシンボルを検索したり、不足しているアドレスを埋めたりするときなど。

したがって、厳密に言えば、3 番目の小さなステップのみがコンパイルです。さらに、GNU ツールチェーンと make を使用すると、最初の 4 つのステップ (.c ソース ファイルからオブジェクト ファイルを生成する) を 1 つのコンパイルとして呼び出す傾向があります。

詳細はこちら...

于 2012-10-07T05:16:33.157 に答える
2

コンパイルは一般に、ソース コードをマシン コードに変換することと考えられていますが、マシン コードをリンクして最終的な実行可能ファイルを作成することも必ずしも必要ではありません。ビルドは、最終的な実行可能ファイルを作成するプロセス全体を表す、より一般的な用語です。ビルドには、コンパイルとリンクの両方が含まれます。-c オプションを使用していない場合、リンクは自動的に行われるため、これはビルドと見なされますが、コンパイルもそのプロセスの一部でした。

ただし、用語が少し大まかに使用されていることに気付くかもしれません。

于 2012-10-07T05:09:41.990 に答える
0

プログラムをコンパイルするとき、コンパイラは、ファイルにコンパイル時のエラー (構文エラーやセマンティック エラーなど) があるかどうかをチェックするだけです。プログラムを「ビルド」すると、コンパイラは最初にプログラム内のエラーをチェックし、次にソース コードをマシン コードに変換し (実際のコンパイル)、その過程で実行可能ファイルを作成します。

2 番目の質問については、gcc -o helloworld helloworld.c「ソース コードを実行可能ファイルに変換する」には「はい」だけで十分です。

于 2012-10-07T05:10:53.860 に答える