【发布时间】:2014-05-06 11:57:02
【问题描述】:
我正在尝试改进我在 makefile 中使用的简单解决方案(用于编译目标的单一规则和用于将所有先前目标链接在一起的附加规则)。 我想出了以下 Makefile(已剪辑):
.PHONY: clean
BASE_DIR = ../
CC = gcc
CROSS_COMPILE = arm-none-eabi-
CFLAGS =-g -I${BASE_DIR}/include
LDFLAGS =-L${BASE_DIR}/lib -Ttarget.ld -nostdlib
SOURCES = first.c second.c third.c fourth.c
OBJECTS = $(SOURCES:.c=.o)
EXECUTABLE = $(OBJECTS:.o=)
all: $(EXECUTABLE)
%:
${CROSS_COMPILE}$(CC) $(CFLAGS) $(LDFLAGS) $*.c -o $*
clean:
rm ${EXECUTABLE}
这很好用,但我想将编译和链接过程分开。因此我尝试修改如下:
.PHONY: clean
BASE_DIR = ../
CC = gcc
CROSS_COMPILE = arm-none-eabi-
CFLAGS =-c -g -I${BASE_DIR}/include
LDFLAGS =-L${BASE_DIR}/lib -Ttarget.ld -nostdlib
SOURCES = first.c second.c third.c fourth.c
OBJECTS = $(SOURCES:.c=.o)
EXECUTABLE = $(OBJECTS:.o=)
all : $(EXECUTABLE)
%.o : %.c
@echo "Compiling c file into o file"
${CROSS_COMPILE}$(CC) $(CFLAGS) $< -o $@
% : %.o
@echo "Linking o file into executable"
${CROSS_COMPILE}$(CC) $(LDFLAGS) $< -o $@
clean:
rm ${EXECUTABLE}
这工作正常,然后我调用 Makefile 作为例如make first.o; make first 或者如果我将 EXECUTABLE = $(OBJECTS:.o=) 修改为 EXECUTABLE = $(OBJECTS:.o=.out) 和 % : %.o 修改为 %.out : %.o。但是,如果我尝试以make 或make first 调用编译,则使用隐式规则。
我尝试浏览 Makefile 手册,但里面确实有很多信息,我有点困惑。
如何修改 Makefile 以允许同时调用构建单独的目标为make <target> 或所有目标为make?
【问题讨论】:
标签: makefile