【问题标题】:I cannot figure out GNU make pattern rules example from the GNU manual我无法从 GNU 手册中找出 GNU make 模式规则示例
【发布时间】:2013-10-20 21:45:17
【问题描述】:

示例如下:

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

【问题讨论】:

    标签: makefile


    【解决方案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?您可以将所有规则放入同一个 makefile。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 1970-01-01
      • 2017-09-26
      • 2014-05-05
      • 1970-01-01
      相关资源
      最近更新 更多