2016-06-18 73 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) $< 
相關問題