2016-06-18 62 views
1

我有下面的Makefile:Ç的Makefile - Exec和目标文件到不同的目录

CC=gcc 
CFLAGS=-Wall -g -Wextra -DNDEBUG $(OPTFLAGS) 

VPATH=%.c src 
VPATH=%.h src 
VPATH=%.o obj 
SOURCES=$(wildcard **/*.c *.c) 
OBJECTS=$(patsubst %.c,obj/%.o,$(SOURCES)) 

TEST_SRC=$(wildcard tests/*_tests.c) 
TESTS=$(patsubst,%.c,%o,$(TEST_SRC)) 

TARGET=bin/ex 

$(OBJECTS):$(SOURCES) 
    $(CC) -c $(CFLAGS) $< -o [email protected] 

# The target build 
all:$(TARGET) 

$(TARGET):CFLAGS+=-fPIC 
$(TARGET):build $(OBJECTS) 
    $(CC) -c $(CFLAGS) $< -o [email protected] $(OBJECTS) 

我试图才达到是在OBJ目录下的所有* .o文件和最终的可执行文件在bin目录。

的文件夹结构如下:

project/ 
    src/ 
    obj/ 
    bin/ 

当我运行make我得到下面的错误,我不能修复: 不能创建OBJ/src目录/ ex.o:没有这样的文件或目录

显然它的目标是错误的路径。任何帮助,将不胜感激。

编辑

基础上的第一个评论我得到了我的问题我已经清理了Makefile文件,并与下面的解决方案,没有工作,但它创造了“SRC”子文件夹放到来到“目标文件”。我的一个错误是我在尝试构建exec时使用了-c标志。

CC=gcc 
CFLAGS=-Wall -g -Wextra -DNDEBUG $(OPTFLAGS) 
LIBS=-ldl $(OPTLIBS) 
#PREFIX?=/usr/local 

SOURCESDIR=src 
OBJECTSDIR=obj 
SOURCES=$(wildcard **/*.c *.c) 
OBJECTS=$(patsubst %.c,obj/%.o,$(SOURCES)) 

TEST_SRC=$(wildcard tests/*_tests.c) 
TESTS=$(patsubst,%.c,%o,$(TEST_SRC)) 

TARGET=bin/ex 

$(OBJECTS):$(SOURCES) 
    @$(call make-repo) 
    $(CC) -c $(CFLAGS) $< -o [email protected] 

# The target build 
all:$(TARGET) tests 

dev:CFLAGS=-Wall -g -Isrc -Wextra $(OPTFLAGS) 
dev:all 


$(TARGET):CFLAGS+=-fPIC 
$(TARGET):build $(OBJECTS) 
    $(CC) $(OBJECTS) $(LDFLAGS) -o [email protected] 

build: 
    @mkdir -p bin 

define make-repo 
    for dir in $(SOURCESDIR); \ 
    do \ 
    mkdir -p $(OBJECTSDIR)/$$dir; \ 
    done 
endef 
+1

恐怕你的makefile是由很多的问题一个比你更重要破正在询问并与其完全无关。我建议你将这个问题放在一边,直到你能够编写一个能够在一个目录中成功生成目标文件和可执行文件的makefile,并且当你有了它的时候回到你的问题。 –

回答

0

你没有正确地处理路径替换,反正有一个简写。此外,您的链接的规则被打破,因为它不会链接(-c),但有一个内置的食谱,你可以只复制

CPPFLAGS := -DNDEBUG 
CFLAGS := -Wall -g -Wextra $(OPTFLAGS) 

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

.PHONY: all 
all: bin/ex 
bin/ex: CFLAGS += -fPIC 
bin/ex: $(objects) 
    $(LINK.o) $^ $(LDLIBS) -o [email protected] 
$(objects): obj/%.o: src/%.c 
    $(COMPILE.c) $(OUTPUT_OPTION) $< 
相关问题