Makefile通用目标规则

时间:2014-05-06 11:57:02

标签: 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}

这很好但我想分开编译和链接过程。因此我尝试按如下方式修改它:

.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。但是,如果我尝试将编译调用为makemake first,则使用隐式规则。

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

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

1 个答案:

答案 0 :(得分:7)

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

但是,我的解释是,如果你运行make first,它会使用内置规则直接从first编译first.c,而不是你的模式规则(注意两者都是-in规则和模式规则被视为“隐式规则”)。

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

% : %.c

(只是那个)你的makefile。