web-dev-qa-db-ja.com

make:「すべて」に対して何も実行されない

Makeファイルを作成するために、たとえばpgmを使用しています。

http://mrbook.org/tutorials/make/

Eg_make_creationフォルダには次のファイルが含まれています。

desktop:~/eg_make_creation$ ls
factorial.c  functions.h  hello  hello.c  main.c  Makefile

メイクファイル

# I am a comment, and I want to say that the variable CC will be
# the compiler to use.
CC=gcc
# Hwy!, I am comment no.2. I want to say that CFLAGS will be the
#options I'll pass to the compiler
CFLAGS=-c -Wall

all:hello

hello:main.o factorial.o hello.o
  $(CC) main.o factorial.o hello.o -o hello

main.o:main.c
  $(CC) $(CFLAGS) main.c

factorial.o:factorial.c
  $(CC) $(CFLAGS) factorial.c

hello.o:hello.c
  $(CC) $(CFLAGS) hello.c

clean:
  rm -rf *o hello

エラー:

desktop:~/eg_make_creation$ make all
make: Nothing to be done for `all'.

このプログラムをコンパイルするための理解を助けてください。

82
Angus

タブではなく、メイクファイルルールのコマンドの前にスペースがあると、「すべてに対して何もしない」エラーが発生することがあります。ルール内でスペースの代わりにタブを使用するようにしてください。

all:
<\t>$(CC) $(CFLAGS) ...

の代わりに

all:
    $(CC) $(CFLAGS) ...

ルールの構文の説明については、GNU makeマニュアルを参照してください。 https://www.gnu.org/software/make/manual/make.html#Rule-Syntax

98
VirtualVDX

helloファイルをフォルダーから削除して、再試行してください。

allターゲットはhelloターゲットに依存します。 helloターゲットは、最初にファイルシステム内の対応するファイルを見つけようとします。見つかって、依存ファイルが最新の場合は、何もする必要はありません。

27
weekens

Makeを指定するだけで、makefileの最初のルール、つまり「すべて」が作成されます。 「all」は「hello」に依存し、main.o、factorial.o、hello.oに依存することを指定しました。したがって、「make」はそれらのファイルが存在するかどうかを確認しようとします。

それらが存在する場合、「make」は依存関係、たとえばmain.oには依存関係main.cがあり、変更されています。それらが変更されている場合、makeはそれらを再構築し、そうでない場合はルールをスキップします。同様に、変更されたファイルを再帰的に作成し、最後に最上位のコマンド「all」を実行して、実行可能ファイル「hello」を作成します。

それらが存在しない場合、makeはルールの下ですべてを盲目的に構築します。

あなたの問題に来て、それはエラーではありませんが、「make」はメイクファイルのすべての依存関係が最新であり、何もする必要がないと言っています!

18

Makeは正しく動作しています。 helloはすでに存在し、.cファイルよりも古いわけではないため、実行する作業はありません。 makeが(再)ビルドする必要がある4つのシナリオがあります。

  • .cファイルの1つを変更すると、helloよりも新しくなり、makeの実行時に再構築する必要があります。
  • helloを削除すると、明らかに再構築する必要があります
  • -Bオプションを使用して、makeにすべてを再構築させることができます。 make -B all
  • make clean allhelloを削除し、再構築が必要です。 (rm -f *.o helloに関する@Matのコメントをご覧になることをお勧めします
14
Aaron McDaid

9行目のタブを見逃したと思います。 all:helloに続く行は空白タブでなければなりません。 9行目に空白のタブがあることを確認してください。 makefileのデフォルトのレシピを使用することをインタープリターに理解させます。

4
Techie

これは、unixのmakeコマンドがタイムスタンプに基づいて動作するエラーではありません。つまり、factorial.cppに特定の変更を加え、make..then makeを使用してコンパイルした場合、** cc -o階乗のみを表示します。 cpp **コマンドが実行されます。次回、同じコマンド、つまり.cpp拡張子のファイルに変更を加えずにmakeを実行すると、コンパイラは出力ファイルが最新であると言います...コンパイラは作成するまでこの情報を提供しますfile.cppに対する特定の変更。 makeファイルの利点は、変更されたファイルのみをコンパイルし、変更されていないファイルのオブジェクト(.o)ファイルを直接使用することにより、再コンパイル時間を短縮できることです......

4
muneshwar

別のルートで、この独特でデバッグしにくいエラーにたどり着きました。私の問題は、ターゲットと依存関係が別々のディレクトリにあるときに、ビルドステップでパターンルールを使用していたことです。このようなもの:

foo/Apple.o: bar/Apple.c $(FOODEPS)

%.o: %.c
    $(CC) $< -o $@

この方法でいくつかの依存関係を設定し、それらすべてに1つのパターンレシピを使用しようとしました。明らかに、「%」の単一の置換はここでは機能しません。依存関係ごとに明示的なルールを作成しましたが、子犬とユニコーンの中に戻ってきました!

foo/Apple.o: bar/Apple.c $(FOODEPS)
    $(CC) $< -o $@

これが誰かを助けることを願っています!

0
sfaleron