2017-01-05 8 views
0

私は世界を最もシンプルに(比較的一般的な)Makefileにしようとしています。何らかの理由でMakefileがオブジェクトファイルをc: %.o: %.cという形式にする暗黙のルールを理解するのを拒否すると、no rule to make target %.oが必要になります。test1.exeが必要になります。以下は、全体が私のMakefile次のとおりです。Makefileに私の暗黙のルールが表示されない

INC  = sglib 
CC  = gcc 
LD  = gcc 
LDFLAGS = 
# On MS-Windows, say "make os=win" to set proper extensions 
os = 
SO = 
EXE = 

ifeq ($(os), win) 
SO = dll 
EXE = .exe 
# -fPIC is a no-op on Windows, but causes a compiler warning 
CFLAGS = -std=gnu99 -ggdb3 -Wall 
else 
SO = so 
CFLAGS = -std=gnu99 -ggdb3 -Wall -fPIC 
endif 


all: test1$(EXE) 

test1$(EXE): %.o 
    $(LD) $< -o [email protected] 

lib-test.$(SO): %.o 
    $(LD) -shared $(LDFLAGS) -o [email protected] $< 

%.o: %.c 
    $(CC) $(CFLAGS) -I$(INC) -c $< -o [email protected] 

check: 
    echo Nothing yet! 

.PHONY: all clean 

clean: 
    rm -f *.o *.$(SO) test1$(EXE) 

私は窓gnu make 4.2.1と20とgcc 6.2.0msysを使用しています。私はそこに何が間違っているのか困惑している。それはおそらく単純なものですが、私は今は目が見えないようです。

+0

'%.o:%.c'は' anything.c'をコンパイルして 'anything.o'を得ることができるようにします。しかし、 'test1 $(EXE):%.o'は、' test1 $(EXE) 'を得るために、'%.o'(そのルールを使って '%.c'をコンパイルすることによって得られる) '%.c'というファイルがありますか? – immibis

+0

Whauh!正直言って、ここで皆さんがやっていることは分かりません。 「の追加情報を追加するためにあなたの質問に編集リンクをご利用くださいポストの回答ボタンが唯一の問題への完全な答えを使用する必要があります - 。。口コミより - モルテン・ジェンセン6時間前」 私は望んでいませんでした追加情報を追加するには、私の投稿に答えた人に感謝し、彼らが助けになっていることを確認し、正しい場所を指摘しました。そして今私はanwersを投稿することも禁止されています:-)。 私はかなり混乱していますが、とにかく助けてくれて、自分を楽しんで、みんな良い人生を送ってください。 – user1648090

+1

@ user1648090あなたが答えた人に感謝する方法は、彼らの答えを上書きして、そして/または最も有益なものを受け入れることです。 「誰かが答えるときに何をするか」(http://stackoverflow.com/help/someone-answers)を参照してください。また、[ツアー]を見てください。 – Barry

答えて

0

あなたはこのようなルールであることを考えているように見える:

test1$(EXE): %.o 

%記号はファイル名展開を引き起こすワイルドカード文字である - そうではありません。 .oファイルのリストを作成する場合は、組み込みのwildcard関数を使用する必要があります。

https://latedev.wordpress.com/2014/11/08/generic-makefiles-with-gcc-and-gnu-make/で始まるジェネリックmakefileについてのブログ記事がいくつかありますが、役に立つかもしれません。

3

この:

test1$(EXE): %.o 

は、ターゲットtest1の前提条件は、ファイル%.oであると述べてルールを定義します。オブジェクトファイルのワイルドカードによるリストではありません。 具体的には%.oという名前のファイル。あなたはそのファイルを作成するためのメイクファイルに他のルールはなく、現在存在しないので、あなたが得るエラーです。

%のみ%ターゲットに表示されたルールである、Pattern Rules内のプレースホルダ(及びpatsubstなど同様の機能)として作用します。だからあなた:

%.o : %.cpp 
    $(CC) $(CFLAGS) -I$(INC) -c $< -o [email protected] 

があるため%.o%の、パターンルールです。これは、ターゲット%.oを構築するルールを作成するのではなく、接尾辞.oを持つファイルを作成します。これはターゲットfoo.oを作成しようとしているときに適用されます。つまり、と一致するステムを持つのステッカーを持つpreqrequiste foo.cppで暗黙のルールを作成します。

あなたはとなりますが、実際にははオブジェクトファイルをワイルドカードにします。

test1$(EXE) : $(wildcard *.o) 

これは実際には機能しません。最初にビルドしようとすると、まだ存在するオブジェクトファイルはありません。明らかに。したがって$(wildcard *.o)は空の文字列を返し、ナンセンスになります。だからあなたはそれらをワイルドカードできません。あなたがfoo.cbar.c、およびbaz.c$(wildcard)関数のようにソースファイルを持っている場合今

source_files := $(wildcard *.c) 
object_files := $(source_files:.c=.o) 

test1$(EXE) : $(object_files) 
    $(LD) $< -o [email protected] 

は今がちょうどそのリストを考え出す必要があります:あなたは、明示的にその文字列を提供する必要がありますそれらを見つけてsource_filesfoo.c bar.c baz.cに設定します。次の行の置換はobject_filesからfoo.o bar.o baz.oに設定されます。したがって、これらの3つのオブジェクトファイルに応じてtestになります。これらのオブジェクトファイルを作成するためのパターンルールがすでに用意されています。

関連する問題