以下是示例:
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
根据我的理解,此规则查找所有c源文件* .c并将它们编译为目标文件* .o。当我只想将文件编译成目标文件时,如何定义“所有”规则?
另外,如果我想构建可执行文件,我该如何玷污链接规则?类似的东西:
TARGET = bsort
CPPFLAGS = -g -Wall
LFLAGS =
all: $(TARGET)
$(TARGET): ???
$(CC) $(LFLAGS) %.o -o $(TARGET)
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
所以,我试图使用模式规则生成两个makefile,一个makefile编译成目标文件,另一个make文件生成可执行文件。我的项目通常有多个源文件和头文件。
答案 0 :(得分:1)
该规则找不到任何东西。它只是告诉make,“如果你想构建一个.o文件并且你有一个.c文件,这里是你可以使用的秘诀”。
如果你在一个目录中运行make
,其中的makefile只包含该规则,那么你将收到一条消息nothing to do
,因为你实际上并没有告诉make构建任何具体的东西,你是'我只是告诉它如何来构建一些东西。
如果您想要一个仅构建目标文件的all
规则,那么您可以写:
.PHONY: all
all: foo.o bar.o baz.o
现在make有一个真正依赖的真实目标,它可以使用你定义的模式规则来构建那些.o文件。
您不能在食谱中使用%.o
。配方是用shell脚本语法编写的,%.o
不是shell脚本语法。您可以编写*.o
这是shell脚本,但这不是一个好的解决方案。相反,您应该将目标的先决条件定义为要链接的.o文件,然后使用$^
自动变量在配方中引用它们(请参阅GNU make manual部分关于自动变量):
$(TARGET): foo.o bar.o baz.o
$(CC) $(LFLAGS) -o $(TARGET) $^
为什么你想要两个不同的makefile?您可以将所有规则放在同一个makefile中。