Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 生成文件通用目标规则_Makefile - Fatal编程技术网

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

我正在尝试改进我在makefile中使用的朴素解决方案(编译目标的单一规则和将所有以前的目标链接在一起的附加规则)。 我提出了以下生成文件(剪辑):

这很好,但我想将编译和链接过程分开。因此,我尝试对其进行如下修改:

.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