有关Makefile的有趣问题

时间:2018-03-13 16:13:51

标签: makefile gnu-make

以下是我的Makefile:

CC=mpicc
CFLAGS=-Wall -O3
SRCS = $(wildcard *.c)
OUTS = $(patsubst %.c,%,$(SRCS))
.c.o:
        $(CC) $(CFLAGS) -c $<
SRC_CODE=\
        mpiex1.c\
        mpiex2.c\
        mpiex3.c
SOFI2D_OBJ=$(SRC_CODE:%.c=%.o)
sofi2D: $(SOFI2D_OBJ)
        $(CC) $^ -o $@
clean:
        rm -rf *.o *.o* *~ *.dSYM $(OUTS)   
all: clean sofi2D

三个问题:

(1)我不认为

.c.o:
        $(CC) $(CFLAGS) -c $<

这里是必要的,因为.o文件是中间文件,我可以删除这个命令并写一个更简单的文件:

CC=mpicc
CFLAGS=-Wall -O3
SRCS = $(wildcard *.c)
OUTS = $(patsubst %.c,%,$(SRCS))
SRC_CODE=\
        mpiex1.c\
        mpiex2.c\
        mpiex3.c
sofi2D: $(SRC_CODE)
        $(CC) -c $(CFLAGS) $^ -o $@
clean:
        rm -rf *.o *.o* *~ *.dSYM $(OUTS)   
all: clean sofi2D

我是对的吗?那么在这个时候我只会获得可执行文件而不生成任何obj文件?

(2)如果3个源代码彼此无关,我怎样才能逐个编译它们?我尝试了以下,我是对的吗?

CC=mpicc
CFLAGS=-Wall -O3
SRCS = $(wildcard *.c)
OUTS = $(patsubst %.c,%,$(SRCS))
SRC_CODE=\
        mpiex1.c\
        mpiex2.c\
        mpiex3.c
all: $(SRC_CODE)
%: %.c
        $(CC) -c $(CFLAGS) $< -o $@
clean:
        rm -rf *.o *.o* *~ *.dSYM $(OUTS)   
.PHONY: clean

通过这种方式,似乎不会生成obj文件(我只能获取可执行文件)。那么如何修改上面的内容以便我可以获得obj和exe文件?

(3)$(patsubst%.c,%,$(SRCS))是什么意思,如何用英语阅读这篇文章?

1 个答案:

答案 0 :(得分:0)

对于(1),如果你这样写:

sofi2D: $(SRC_CODE)
        $(CC) -c $(CFLAGS) $^ -o $@

然后是的,它不会创建中间对象文件。但另一方面,每次更改任何单个文件 all 时,都必须完全重新编译文件。使用目标文件的目的是避免在任何更改时重新编译世界。如果你想这样做,你甚至不需要makefile,你可以使用编译所有内容的shell脚本。

对于(2)我不明白你想要什么。当你说&#34;源代码彼此无关时#34;你什么意思?你的意思是,你想编译三个不同的可执行文件,每个源文件一个?如果你想这样做,你可以使用你创建的规则,但你必须删除-c标志:该标志告诉编译器不构建可执行文件但只是构建一个目标文件(参见编译器&#39; s文档)。

如果您的意思是要编译目标文件,那么您已经在原始makefile中使用了该文件。

如果你不是那些意思,请更清楚地解释。

对于(3),您可以在GNU make manual中查看完整说明,但简而言之,这意味着&#34;从{{1的扩展中的每个单词的末尾删除.c宏}&#34;。