2017-07-20 4 views
1

私はメイクファイルが実際にどのように動作するかを理解するためにthisフロー図を見ていましたが、まだ何が起こっているのかを100%理解するのに苦労しています。メイクファイルを理解する

function.hとfunction.cppで定義されているいくつかの関数を呼び出すmain.cppファイルがあります。それでは、私はmakefileが与えられる:

main: main.cpp function.o 
    g++ main.cpp function.o -o main 

mainAssembly: main.cpp 
    g++ -S main.cpp 

function.o: function.cpp 
    g++ -c function.cpp 

clean: 
    rm -f *.o *.S main 

linkerError: main.cpp function.o 
    g++ main.cpp function.o -o main 

何が起こっているのですか?私が今まで理解してきたことは、オブジェクトファイルに変わるfunction.cppをコンパイルしていることです。なぜこれが必要ですか?

私はmainAssemblyの部分が実際に何をしているのか分かりません。私はg ++のフラグを読もうとしましたが、これが何であるかはまだ分かりません。これはヘッダーでmain.cppをコンパイルするだけですか? mainをオブジェクトファイルにも変換するべきではありませんか?

私はmainが単にmainと呼ばれるexeファイルにすべてをリンクしていると思いますか? cleanlinkerErrorが何をしようとしているのか全く分かりません。誰かが私が何が起こっているのか理解するのを助けることができる?

答えて

2

このフローチャートは、不必要に複雑に思われるので、説明した以上に混乱します。それぞれのステップは実際には非常に単純で独立しており、それらをすべて1つのチャートに詰め込む必要はありません。

Makefileは、依存関係のチェーン、つまり、左側のファイルが右側のファイルに依存する、操作を実行しようとする操作の順序を確立することを覚えておいてください。 function.cpp変更は、その後、.oファイルを再構築しなければならない場合

function.o: function.cpp 
    g++ -c function.cpp 

ここfunction.ofunction.cpp製品である、あなたの最初の部分です。

function.o: function.cpp function.h 
    g++ -c function.cpp 

あなたがプログラムを検討し、単一.oのファイルに単一.cppを構築したいなぜあなたは迷っている場合:function.cpp#includeそれなので、正しい定義はおそらくあるかもしれないので、これは、function.hが存在する場合は、おそらく不完全ですはるかに大きな規模で。変更するたびにすべてのソースファイルを再コンパイルする必要はなく、変更によって直接影響を受けるものだけをコンパイルしたいだけです。編集するfunction.cppfunction.oにのみ影響し、main.oには影響しません。ただし、function.hを変更すると、main.cppの参照のためにmain.oに影響する可能性があります。物事がどのように参照されるかは、#includeによって異なります。

この部分は少し奇妙です:ちょうどmain.cpp用にコンパイルされたアセンブリコードをダンプし

mainAssembly: main.cpp 
    g++ -S main.cpp 

。これはオプションの手順であり、最終実行可能ファイルを作成するためには必要ありません。

この部分ハムは-fistedly二つの部分を組み立て:

main: main.cpp function.o 
    g++ main.cpp function.o -o main 

私は普通ので、あなたが.oへのすべての.cppファイルをコンパイルしてから.oがあなたのlibstdc++ライブラリといずれかと一緒にファイルをリンクしたいと言いますあなたが使用している他の共有ライブラリldのようなツールで、リンカー。典型的なコンパイルの最後のステップは、バイナリの実行可能ファイルまたはライブラリを生成するためのリンクですが、g++はここのように指示されたときに自動的にこれを行います。

私はあなたがここに持っているものよりから動作するようにより良い例だと思います。このファイルはちょうど混乱の完全です。

+1

ありがとうございました! function.oを再定義したときの意味を再説明できますか? function.cppをコードに含める場合は、function.hをインクルードする必要があるかもしれないと言っていますか?また、どのようにしてコンパイルが正確に見えるのでしょうか? –

+0

[この回答はMakefiles](https://stackoverflow.com/questions/1484817/how-do-i-make-a-simple-makefile-for-gcc-on-linux)は、より多くの従来の見た目です。あなたが作ったすべての '.h'ファイルは*変更できる*は、依存関係としてリストされるべきです。その例の '$(HEADERS)'の部分でそれを見ることができます。 – tadman

+0

'x:y z'を「ファイルxの作成はファイルyとzに依存します」と読んでください。後で 'a:x z'のようなものがあるかもしれません。これは、" aを作ることはxとzに依存します "という意味です。これは' x'が間接的に 'y'に依存することを意味します。そこでは、そのような依存関係が累積するときに、フローチャートが本当にバットになってしまいます。それは、「サンドイッチ:パンマグロマスタード」とそれに続く「ランチ:サンドイッチサラダ」のようなものです。ここであなたのランチは、パン、マグロ、マスタードを持って間接的に依存します。 – tadman

関連する問題