C Makefile - exec和目标文件到不同的目录

时间:2016-06-18 12:34:27

标签: makefile gnu-make

我有以下Makefile:

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 $@

# The target build
all:$(TARGET)

$(TARGET):CFLAGS+=-fPIC
$(TARGET):build $(OBJECTS)
    $(CC) -c $(CFLAGS) $< -o $@ $(OBJECTS)

我想要实现的目标是将所有* .o文件放在obj目录中,并将最终的可执行文件放在bin目录中。

文件夹结构如下:

project/
    src/
    obj/
    bin/

当我运行make all时,我收到以下错误,我无法修复: 无法创建obj / src / ex.o:没有此类文件或目录

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

修改

基于第一条评论,我得到了我的问题,我已经清理了Makefile并附带了以下解决方案来完成这项工作,除了它将“src”子文件夹创建为“obj”。我的一个错误是我在尝试构建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 $@

# 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 $@

build:
    @mkdir -p bin

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

1 个答案:

答案 0 :(得分: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 $@
$(objects): obj/%.o: src/%.c
    $(COMPILE.c) $(OUTPUT_OPTION) $<