我正在尝试改进天真的解决方案(用于编译目标的单个规则以及用于将所有先前目标链接在一起的附加规则),我使用了我的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
来构建单独的目标?
答案 0 :(得分:7)
您描述问题的段落非常混乱且难以理解。在提出问题时,请确保描述问题的部分最清楚:如果您提供示例输出,确切地显示您键入的命令和获得的结果,并解释您希望获得的结果,则会很有帮助。
但是,我的解释是,如果你运行make first
,它会使用内置规则直接从first
编译first.c
,而不是你的模式规则(注意两者都是-in规则和模式规则被视为“隐式规则”)。
这是因为make将选择“更短”的隐式规则链,因此直接从源构建可执行文件的规则在一个步骤中,而不是构建对象,然后在两个步骤中构建可执行文件将是首选。如果您不想使用内置隐式规则,则需要使用-r
标志调用make,或者通过添加以下内容来调用delete it:
% : %.c
(只是那个)你的makefile。