Makefile通用目标规则

Seb*_*mer 7 makefile

我正在尝试改进天真的解决方案(用于编译目标的单个规则和用于将所有先前目标链接在一起的附加规则),我使用了我的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}
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我想分开编译和链接过程.因此我尝试将其修改如下:

.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}
Run Code Online (Sandbox Code Playgroud)

这工作正常然后我调用Makefile作为例如make first.o; make first或如果我修改EXECUTABLE = $(OBJECTS:.o=)to EXECUTABLE = $(OBJECTS:.o=.out)% : %.oto %.out : %.o.但是,如果我尝试调用编译makemake first使用隐式规则.

我尝试过Makefile手册,但那里确实有很多信息,我有点困惑.

如何修改Makefile以允许同时调用构建单独的目标作为make <target>或所有目标make

Mad*_*ist 9

您描述问题的段落非常混乱且难以理解.在提出问题时,请确保描述问题的部分最清楚:如果您提供示例输出,确切地显示您键入的命令和获得的结果,并解释您希望获得的内容,则会很有帮助.

但是,我的解释是,如果你运行make first它,则使用内置规则first直接编译first.c,而不是你的模式规则(请注意,内置规则和模式规则都被视为"隐式规则").

这是因为make将选择"更短"的隐式规则链,因此直接从源构建可执行文件的规则,在一个步骤中,而不是构建对象,然后在两个步骤中构建可执行文件,将是首选.如果您不想使用内置隐式规则,则需要使用-r标志调用make ,否则通过添加以下内容来删除它:

% : %.c
Run Code Online (Sandbox Code Playgroud)

(只是)你的makefile.