我无法从GNU手册中找出GNU make模式规则示例

时间:2013-10-20 21:45:17

标签: makefile

以下是示例:

     %.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文件生成可执行文件。我的项目通常有多个源文件和头文件。

1 个答案:

答案 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中。