2017-12-09 20 views
0

私は今Linuxで問題なく使用しているmakefileを使用している間に、最近問題を抱えています。 それは、すべてのオブジェクト、ソースファイル、およびコンパイルプロセスに使用されるヘッダーで文字列を生成することです。しかし、私は特別な治療のいくつかの種類を必要とするobjetcsに特定のルールを書いた、と私は以下のパターンルールを使用していた残りのため:LinuxのWindowsでのGNU Makeパターンルール

obj/%.o: src/%.c 
    $(CC) $(CFLAGS) $< -o [email protected] 

それが働いているが、私は上の使用しようとすると、 Windowsは、当然のいくつかの変更と、それがないと、私は次のエラーを取得する:

make: *** No rule to make target 'obj\battle.o', needed by 'programa'. Stop

私は一人でそれを理解しようとしてきたが、それは困難でした。

Linuxのメイク:

SOURCES := $(shell ls src/*.c) 
SUBST1 := $(subst src/,obj/,$(SOURCES)) 
OBJECTS := $(subst .c,.o,$(SUBST1)) 
HEADERS := $(shell ls headers/*.h) 
CC = gcc 
LFLAGS = -g -I headers/ -o programa -Wall -pedantic 
CFLAGS = -g -I headers/ -c -Wall -pedantic 

programa: $(OBJECTS) $(HEADERS) 
    $(CC) $(LFLAGS) $(OBJECTS) -lm 

obj/arvore.o: src/arvore.c 
    $(CC) $(CFLAGS) -lm $< -o [email protected] 

obj/main.o: $(HEADERS) 

obj/%.o: src/%.c 
    $(CC) $(CFLAGS) $< -o [email protected] 

clean: 

ifneq ($(shell ls obj/*.o),) 
    rm obj/*.o 
endif 

ifneq ($(findstring ./programa, $(shell find . -maxdepth 1 -perm -111 -type f)),) 
    rm programa 
endif 

############################################################## 
.PHONY = programa organize clean 

Windowsのメイク:

AA = aa 
SOURCES := $(shell dir /b /s src\*.c) 
SUBST1 := $(subst $(shell cd)\, ,$(SOURCES)) 
SUBST2 := $(subst src\,obj\,$(SUBST1)) 
OBJECTS := $(subst .c,.o,$(SUBST2)) 
HEADERS := $(shell dir /b /s headers\*.h) 
CC = gcc 
LFLAGS = -g -o jogo -Wall -pedantic 
CFLAGS = -g -c -Wall -pedantic 

programa: $(OBJECTS) $(HEADERS) 
    $(CC) $(LFLAGS) $(OBJECTS) -lm 

obj\main.o: src\main.c $(HEADERS) 
    $(CC) $(CFLAGS) $< -o [email protected] 

obj\arvore.o: src\arvore.c 
    $(CC) $(CFLAGS) -lm $< -o [email protected] 

obj\%.o: src\%.c; 
    $(CC) $(CFLAGS) $< -o [email protected] 

clean: 
ifneq ($(findstring .o, $(shell dir /b obj\*.o)),) 
    del obj\*.o 
endif 

ifneq ($(findstring jogo.exe, $(shell dir /b *.exe)),) 
    del jogo.exe 
endif 

PS:Windowsのメイクファイルの変数AAが、それは、一時的な修正ですので、通常はそれを "食べる" なし最初の変数からのchar、例えばCC = gccと言ってみましょう。最初のものですが、なぜそれが起こるのか知っていれば、cmdのコマンドは "cc -g [...]"になります。

ありがとうございます。

+0

を、私はそれがここ原因だ疑うが、SUBST1のディレクトリ接頭辞を使用することができます削除されます 'subst' '、'ではなく、 '...'で置き換えて、悪いところに空白が残っている可能性があります。 – lockcmpxchg8b

答えて

2
  • あなたはパターンルール
  • 後スプリアス;を持っているWindows上で行うことは、あなたが内部的にバックスラッシュを使用している場合、それはスラッシュを使用し、その窓ツールのために必要なときだけにして交換する方がはるかに簡単だ正常に動作しません。 delのように、それらなしでは動作しません。

  • 多くのファイル処理にWindowsシェルを使用する必要はありません。makeには内部機能があります。 (-Wallなど)をリンクする際のフラグをコンパイル

  • は効果がありませんし、あなたがたときにオブジェクトファイルがすべき、ヘッダの全てに依存するように最終的な実行を強制しました(-lm
  • のコンパイル時にリンクフラグは効果がありません彼らが必要とするヘッダーに正確に依存します。 gccの依存関係生成機能-MMDなどを使用して、代わりに-include機能を作成してください。
  • CCあなたのケースでちょうどgcc
  • binディレクトリに ccにmakeが組み込まれている多くのためのルールやレシピ、コピー、リンクしたり、デフォルトコンパイラのコピーであるべき、デフォルトで ccに展開一般的な操作は、それらをリサイクル

次のようにあなたのメイクファイルを凝縮することができます。

sources := $(wildcard src/*.c) 
objects := $(sources:src/%.c=obj/%.o) 
deps := $(objects:.o=.d) 

CPPFLAGS := -MMD -MP 
CFLAGS := -g -Wall -pedantic 
LDLIBS := -lm 

jogo.exe: $(objects) 
    $(LINK.o) $^ $(LDLIBS) -o [email protected] 

obj/%.o: src/%.c 
    $(COMPILE.c) $(OUTPUT_OPTION) $< 

clean: 
    -del $(subst /,\,$(objects) $(deps)) jogo.exe 

-include $(deps) 
関連する問題