2016-05-04 9 views
1

Makefileに関する初心者の質問があります。私は非常にシンプルなメイク含むがありますMakefileでオブジェクトの規則が見つかりません

SHELL = /bin/sh 
CC = gcc 
CFLAGS = -lm -std=c99 -g -o0 
EXEC = test 
BUILDDIR = build 
OBJDIR = obj 
SOURCES = $(shell cat sources.list) 
DEPS = $(shell cat headers.list) 
OBJ = $(SOURCES:.c=.o) 
OBJECTS = $(patsubst %,$(OBJDIR)/%,$(OBJ)) 

all: $(OBJECTS) 
    $(CC) $(CFLAGS) $(OBJECTS) -o $(BUILDDIR)/$(EXEC) 

$(OBJDIR)/%.o: %.c $(DEPS) 
    $(CC) -c $< -o [email protected] 

clean: 
    rm -f $(BUILDDIR)/$(EXEC) $(OBJDIR)/*.o 

私の問題は、私はコンパイルするために、このMakefileを使用しようとする場合、それはエラーメッセージを返します。

there is no rule for the target obj/Name.o 

私が間違っているのは何を?最初のいくつかのコメントや今後の研究の後

それは私が

SHELL = /bin/sh 
CC = gcc 
CFLAGS = -lm -std=c99 -g -o0 
EXEC = test 
BUILDDIR = build 
OBJDIR = obj 
SOURCES = $(shell cat sources.list) 
DEPS = $(shell cat headers.list) 
OBJ = $(SOURCES:.c=.o) 
OBJECTS = $(patsubst %,$(OBJDIR)/%,$(OBJ)) 

all: $(BUILDDIR)/$(EXEC) 

$(BUILDDIR)/$(EXEC): $(OBJ) 
$(CC) $(CFLAGS) $(OBJ) -o $(BUILDDIR)/$(EXEC) 

%.o: %.c $(DEPS) 
$(CC) -c $< -o [email protected] 


clean: 
rm -f $(BUILDDIR)/$(EXEC) $(OBJDIR)/*.o 
+0

は 'Name.c'は、トップレベルのディレクトリに、存在していますか? –

+0

はい、それ以外の場合、メイクファイルに.oをビルドする必要はありません – Thorsten

+0

'sources.list'ファイルにname.cはありますか? – jdarthenay

答えて

1

を目指すものではないので、私はこの作業バージョンになったが、それがobjフォルダ内のオブジェクト・ファイルを作成しませんされているすべてのheaders.listのファイルは適切な場所にありますか?

ところで、これはヘッダーの依存関係を処理する良い方法ではありません。依存関係を生成するには、-MP-MDDとプリプロセッサの他のオプションを見てください。

0

あなたが必要なものを行う必要があり、古典的なメイクファイル:

SHELL=/bin/bash 
CC=gcc 
CFLAGS=-std=c99 -g -o0 
LDFLAGS=-lm 
EXEC=test 
BUILDDIR=build/ 
OBJDIR=obj/ 
SOURCES=$(shell cat sources.list) 
OBJECTS=$(patsubst %.c,$(OBJDIR)%.o,$(notdir $(SOURCES))) 

vpath %.c $(sort $(dir $(SOURCES))) 

.PHONY:all mrproper clean depends 

all:$(BUILDDIR)$(EXEC) 

$(BUILDDIR)$(EXEC):$(OBJECTS)|$(BUILDDIR) 
    $(CC) $(CFLAGS) $^ -o [email protected] $(LDFLAGS) 

$(OBJDIR)%.o:%.c|$(OBJDIR) 
    $(CC) -c $< -o [email protected] 

$(BUILDDIR) $(OBJDIR): 
    mkdir [email protected] 

mrproper:clean 
    rm -f $(BUILDDIR)$(EXEC) 

clean: 
    rm -f $(OBJECTS) 

depends: 
    @rm -f dependencies.mk 
    @for i in $(SOURCES); do $(CC) -MM $$i -MT $(OBJDIR)`basename $$i | sed s:.c$$:.o:` >> dependencies.mk; done 

include $(wildcard dependencies.mk) 

何かが明確でない場合、私に知らせてください。

使用法:

make depends 
make 
関連する問題