Makefile 生成文件通用目标规则
我正在尝试改进我在makefile中使用的朴素解决方案(编译目标的单一规则和将所有以前的目标链接在一起的附加规则)。 我提出了以下生成文件(剪辑): 这很好,但我想将编译和链接过程分开。因此,我尝试对其进行如下修改:Makefile 生成文件通用目标规则,makefile,Makefile,我正在尝试改进我在makefile中使用的朴素解决方案(编译目标的单一规则和将所有以前的目标链接在一起的附加规则)。 我提出了以下生成文件(剪辑): 这很好,但我想将编译和链接过程分开。因此,我尝试对其进行如下修改: .PHONY: clean BASE_DIR = ../ CC = gcc CROSS_COMPILE = arm-none-eabi- CFLAGS =-c -g -I${BASE_DIR}/include LDFLAGS =-L${BASE_DIR}/lib -Ttar
.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}
。假冒:干净
基本目录=/
CC=gcc
交叉编译=arm none eabi-
CFLAGS=-c-g-I${BASE_DIR}/include
LDFLAGS=-L${BASE_DIR}/lib-Ttarget.ld-nostdlib
来源=第一个.c第二个.c第三个.c第四个.c
对象=$(源:.c=.o)
可执行文件=$(对象:.o=)
全部:$(可执行)
%.o:%.c
@echo“将c文件编译为o文件”
${CROSS_COMPILE}$(CC)$(CFLAGS)$<-o$@
%:%
@echo“将o文件链接到可执行文件”
${CROSS\u COMPILE}$(CC)$(LDFLAGS)$<-o$@
清洁:
rm${EXECUTABLE}
这可以正常工作,然后我调用Makefile,例如makefirst.o;如果我将可执行文件=$(对象:.o=)
修改为可执行文件=$(对象:.o=.out)
和%:%.o
修改为%.out:%.o
。但是,如果我尝试以make
或makefirst
的形式调用编译,则会使用隐式规则
我试着阅读Makefile手册,但是里面有很多信息,我有点困惑
如何修改Makefile以允许调用将单独的目标作为make
或将所有目标作为make
同时调用?描述问题的段落非常混乱且难以理解。提问时,请确保描述问题的部分最清楚:如果您提供示例输出,准确显示您键入的命令和得到的结果,并解释您希望得到的结果,这将非常有用
但是,我的解释是,如果运行make first
,它将使用内置规则直接从first.c
编译first
,而不是您的模式规则(请注意,内置规则和模式规则都被视为“隐式规则”)
这是因为make将选择“较短”的隐式规则链,因此最好是一步直接从源代码构建可执行文件,而不是两步构建对象然后再构建可执行文件。如果不想使用内置隐式规则,则需要使用-r
标志调用make,或者添加:
% : %.c
(仅此而已)发送到您的makefile。如果我的描述令人困惑,我很抱歉,我已尽最大努力将其弄清楚。您所说的“内置规则和模式规则都被认为是“隐式规则”是什么意思?我提供的规则不被认为是显式的?不。显式规则是类似于foo:foo.o
的规则:它们有明确的目标名称。后缀规则(.c.o
)和模式规则(%.o:%.c
)没有明确的目标;它们是隐含的规则。默认情况下,make提供了许多隐式规则,这些规则都是内置规则。您的问题:重新阅读此描述,尝试想象您对问题一无所知:这可以正常工作,然后我调用Makefile,例如Makefirst.o;如果我将可执行文件=$(对象:.o=)
修改为可执行文件=$(对象:.o=.out)
和%:%.o
修改为%.out:%.o
。但是,如果我尝试以make
或makefirst
的形式调用编译,则会使用隐式规则。你真的明白了吗?
% : %.c