2016-09-08 3 views
-1

私は非常に簡単なことを言っています。私はmain.cとinput_error.hというヘッダファイルを持っています。私の非常にシンプルなメークファイルが動作しないのはなぜですか?

main.o : main.c input_error.h 
    gcc -c main.c 

"make"コマンドを実行するとgcc -c main.cが実行されますが、main.cファイルに行った変更は更新されません。手動で "gcc main.c"を入力すると正常に動作します。

編集:私は別のルールを追加する必要があるように思えるが、私はそれがあなたのメイクファイルのみ.oファイルを作成します現時点で

+0

'gcc -c main.cが実行されましたが、変更は更新されていません。それ無理。コマンドが実行されると、その時点で '.c'ファイルから最新の' .o'ファイルが生成されます。あなたは何かを誤解しています。それが「どのような変更も更新していない」と考えているかどうかを明確にしてください。最終的な実行可能ファイルが生成されないということは、そのルールが中間オブジェクトのみを構築し、リンクしないためです。あなたは別のリンクルールがある場合は、それを示してください。 – kaylum

+1

'gcc main.c'を手動で実行することは、makeファイル内のルールコマンド' gcc -c main.c 'と同じではありません。だからそれは匹敵しない。 – kaylum

+0

はいこれは完全なメークファイルです。 main.cに移動して 'printf( "Hello World \ n"を追加してからmakeを実行すると、それは表示されません) – Sidward

答えて

2

を伴うかわからないんだけど。 2つの方法でバイナリを構築できます。 makeは、ブラウザによって変換された可能性があるため、targetsステートメントのインデントを4つのスペースではなくタブにする必要があることに注意してください。

ビルド.o別にリンクバイナリ。 -cスイッチを使用すると、gccはオブジェクトファイルのみをビルドします。

main: main.o 
    gcc main.o -o main 

main.o : main.c input_error.h 
    gcc -c main.c -o main.o 

ビルドステップ1で

main: main.c input_error.h 
    gcc main.c -o main 

あなたはまた、(ターゲット($ @を)、最初の依存関係($ <)とすべてを示すために、特殊な変数を使用して、メイクファイルでの繰り返しを避けることができます@ ^)依存関係。

上記の行のいずれかになる可能性があります

main.o : main.c input_error.h 
     gcc -c $< -o [email protected] 

最初は少しわかりにくいようですが、あなたはそれを使います。 @kaylumsの暗黙のルールは、タイピングを減らすのにも役立ちます。

+0

私は本当に速い答えに感謝します。ありがとう! – Sidward

2

メイクファイルには、.oファイルをコンパイルするルールが1つしかありません。つまり、最終実行可能ファイルをリンクするルールはありません。

makeには、多くの共通ターゲットを構築する暗黙のルールがあります。

all: main 

main.o : input_error.h 

さらに説明について:

  • all: main:これが最初のターゲットであるので、それが明示的なターゲット場合、デフォルトによって構築されるものですので、あなたのMakefileは次のような単純なものでしたmakeコマンドラインに提供されています。単一のターゲットmainに依存します。
  • mainの明示的な規則はありませんが、makeにはmain.cからビルドする暗黙のルールがあります。
  • main.o : input_error.hinput_error.hが変更された場合は、main.oを再構築する必要があると伝えます。makemain.cを暗黙の知識を持つmakeとしてここに入力する必要はありません。 makeも暗黙的なものであるため、明示的なコマンドは必要ありません。
関連する問題