1. ホーム
  2. c

[解決済み] Makefile にセパレータがない?

2022-02-06 01:43:24

質問

以下のMakefileがうまく動かないのですが、何が起こっているのかわかりません。

CC = gcc
CFLAGS = -Wall -g

demo:
    ${CC} ${CFLAGS} demo.c -o demo
lib:
    ${CC} ${CFLAGS} lib.c -o lib
clean:
    rm -f lib demo

Demoにはメイン関数があり、libにはdemoで使用されるメソッド群があります。

lib に -c フラグを追加しました。しかし、makeを実行すると、次のようになります。

Makefile:5: *** missing separator.  Stop.

解決方法は?

エラーのあるアップデートの場合、その前の行にあるものを確認してください。 ${CC} コマンドを使用してください。多くの make プログラムでは リアル コマンドの前にタブ文字があり、8つのスペースを入れるエディタ(例えば)は、それらを壊してしまいます。これが、"Missing separator"エラーの原因であることが多いようです。

次のような書き起こしでわかると思います。このファイルでは $(xyzzy) :

xyzzy=echo
all:
    $(xyzzy) hello

で、作ってみると、皆さんと同じようなエラーになるんです。

pax> make
makefile:3: *** missing separator.  Stop.

しかし、編集してその4つのスペースをタブにすると、正常に動作するようになりました。

pax> make
echo hello
hello


また、ソースファイルをまとめようとするやり方にも問題がありますね。

を使用せずに -c のフラグを gcc とは別に実行ファイルを作成しようとします。 このようなコマンドはリンカーエラーを引き起こす可能性があります。(簡単な)ようなものが必要でしょう。

CC = gcc
CFLAGS = -Wall -g

# Just compile/link all files in one hit.
demo: demo.c lib.c
   ${CC} ${CFLAGS} -o demo demo.c lib.c

clean:
    rm -f demo

または(少し複雑ですが)。

CC = gcc
CFLAGS1 = -Wall -g -c
CFLAGS2 = -g

# Link the two object files together.

demo: demo.o lib.o
   ${CC} ${CFLAGS2} -o demo demo.o lib.o

# Compile each source file to an object.

demo.o: demo.c
   ${CC} ${CFLAGS1} -o demo.o demo.c

lib.o: lib.c
   ${CC} ${CFLAGS1} -o lib.o lib.c

clean:
    rm -f demo

最初の解決策の問題点は、片方だけが古くなった場合でも、不必要に両方のプログラムをコンパイルしてしまうことです。2番目の解決策は、もう少し賢い方法です。