1

这是示例:

     %.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编译成目标文件,另一个makefile构建成可执行文件。我的项目通常有多个源文件和头文件。

4

1 回答 1

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 手册中有关自动变量的部分):

$(TARGET): foo.o bar.o baz.o
        $(CC) $(LFLAGS) -o $(TARGET) $^

为什么要拥有两个不同的makefile?您可以将所有规则放入同一个生成文件中。

于 2013-10-20T22:11:26.657 回答