以下是我的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))是什么意思,如何用英语阅读这篇文章?
答案 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;。