C MAKEFILE-执行和对象文件到不同目录



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

我要实现的是在OBJ目录中将所有 *.O文件和bin目录中的最终执行。

文件夹结构如下:

project/
    src/
    obj/
    bin/

当我运行时,我会收到以下错误,我无法修复:无法创建OBJ/SRC/EX.O:没有此类文件或目录

显然它针对错误的路径。任何帮助,将不胜感激。

编辑

根据第一个评论,我得到了我的问题,我已经清理了Makefile,并提供了以下解决方案,除了它创建了" SRC"子文件符中的" OBJ"。我的错误之一是我在尝试构建执行官时使用了-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

您无法正确地替换路径,无论如何都有一个速记。另外,您的链接规则不链接,因为它没有链接(-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) $<

最新更新