【发布时间】:2021-03-12 19:51:50
【问题描述】:
我需要做什么
我正在尝试在 c 中创建一个 Makefile,它应该从三个不同的 .c 文件创建三个可执行文件。 我想创建 Lez4Es1、Lez4Es1v2 和 Lez4Es3 作为我在两个不同阶段编译和链接的可执行文件。 比如:
gcc -std=c99 -Wall -pedantic Lez4Es1.c -c
gcc -std=c99 -Wall -pedantic Lez4Es1.o -o Lez4Es1
gcc -std=c99 -Wall -pedantic Lez4Es1v2.c -c
gcc -std=c99 -Wall -pedantic Lez4Es1.v2 -o Lez4Es1v2
gcc -std=c99 -Wall -pedantic Lez4Es3.c -c
gcc -std=c99 -Wall -pedantic Lez4Es3.o -o Lez4Es3
我的解决方案
假设所有 .c 文件都在同一个目录中,我创建了这个 Makefile 但它不起作用:
CC = gcc
CFLAGS += -std=c99 -Wall -pedantic -g
TARGETS = Lez4Es1 \
Lez4Es1v2 \
Lez4Es3 \
.PHONY: all clean cleanall
% : %.o
$(CC) $(CFLAGS) $^ -o $@
%.o : %.c
$(CC) $(CFLAGS) -c $^
all : $(TARGETS)
clean :
-rm *.o *~ core
cleanall :
-rm *.o *.txt -f $(TARGETS) *~ core
问题
当我运行 $ make 它从 .c 文件而不是从 .o 创建可执行文件时,这是编译器的输出:
$ make
gcc -std=c99 -Wall -pedantic -g Lez4Es1.c -o Lez4Es1
gcc -std=c99 -Wall -pedantic -g Lez4Es1v2.c -o Lez4Es1v2
gcc -std=c99 -Wall -pedantic -g Lez4Es3.c -o Lez4Es3
如何解决让他做我想做的事情? 有没有一种方法可以给可执行文件一个不同于 .o 文件的名称?
对不起,我的英语不好,如果我没有很好地解释它,我准备编辑它并给你更多细节,谢谢。
【问题讨论】:
-
有一个内置规则可以从
.c文件创建可执行文件;它优先于您的规则。为什么需要更复杂的两阶段编译?您也可以将.o文件列为目标吗?这可能有帮助,也可能没有帮助;它至少会为您提供您似乎想要的.o文件。 (OBJECTS = $(TARGETS:=.o)作为宏;在all依赖行上的$(TARGETS)之前添加$(OBJECTS)。 -
我需要两阶段编译,因为这是大学的家庭作业。
-
也许您可以使用
make -r来抑制内置规则。您可能需要添加.SUFFIXES: .c .o规则行。 -
它使用 $ make -r 运行,不错的提示!但我需要以 $ make 的身份运行。 .SUFFIXES: .c .o 做什么?谢谢。
-
GNU
makemanual 在Suffix Rules 上有一个部分,其中记录了.SUFFIXES的作用。您可能不需要使用模式样式的% : %.o规则。