C Makefile - 执行和目标文件到不同的目录
Posted
技术标签:
【中文标题】C Makefile - 执行和目标文件到不同的目录【英文标题】:C Makefile - exec and object files to different directories 【发布时间】:2016-06-18 12:34:27 【问题描述】:我有以下 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
【问题讨论】:
恐怕您的 makefile 被比您所询问的问题严重得多且与此无关的问题破坏了。我建议你先把这个问题放在一边,直到你能够编写一个在一个目录中成功构建目标文件和可执行文件的 makefile,然后当你有问题回来。 【参考方案1】:您没有正确处理路径替换,无论如何都有一个简写。此外,您的链接规则已被破坏,因为它没有链接 (-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) $<
【讨论】:
以上是关于C Makefile - 执行和目标文件到不同的目录的主要内容,如果未能解决你的问题,请参考以下文章
Makefile:来自相同源的两个目标使用不同的标志编译两次