我有以下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
答案 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) $<