gpt4 book ai didi

c - 非递归Makefile编译问题

转载 作者:行者123 更新时间:2023-11-30 15:45:17 27 4
gpt4 key购买 nike

阅读了 Emile van Bergen 关于非递归 makefile 的文章后,我尝试从递归转向非递归,但似乎我没有得到正确的结果。

更新:我终于做对了

文件是:

$ ls -R
.:
folder1 Makefile test.c topRules.mk

./folder1:
file.c Rules.mk
<小时/>

测试.c

extern void sub_print();

void main()
{
printf("Top Hello\r\n");
sub_print();

}
<小时/>

生成文件

TARGET  = test.exe
.PHONY: all
all: $(TARGET)

include topRules.mk
dir = folder1
include folder1/Rules.mk

$(TARGET): test.o $(OBJS_folder1)
$(LINK)
<小时/>

topRules.mk

COMPILE = $(CC) $(CFLAGS) -o $@ -c $<
LINK = $(CC) -o $@ $^

%.o: %.c
$(COMPILE)
<小时/>

文件夹1/Rules.mk

sp := $(sp).x
dirstack_$(sp) := $(d)
d := $(dir)

OBJS_$(d) := $(d)/file.o
$(d): $(OBJS_$(d))
<小时/>

文件夹1/文件.c

void sub_print()
{
printf("Hello Sub World\r\n");
}

最佳答案

  1. 从对象列表生成源列表的替换是错误的。它没有剥离 .o扩展名:

     SRC_$(d) := $(OBJS_$(d):%.o=%.c))
    ^^

    完全删除该变量,下一点您将不再需要它。

  2. $(OBJS_$(d)): $((SRC_$(d))规则既多余又错误:

    1. 这是多余的,因为 %.o: %.c模式规则适用并做正确的事情。
    2. 这是错误的,因为它创建了一个规则来完成所有编译,但您需要单独编译每个源。 IE。当你有两个文件时,它将扩展为:

      foo.o bar.o : foo.c bar.c

      但您想要两个单独的规则。

    完全删除该规则并且不要添加任何其他规则。正确的规则就在那里。

    实际上该错误是由于两个规则交互不良造成的。该文档说“如果规则从隐式规则获取命令,$<将是隐式规则添加的第一个先决条件”。由于隐含规则%.o: %.c首先,它提供了命令,但由于显式规则提供了先决条件,因此隐式规则不添加任何内容和 $<膨胀到什么都没有。明确的规则不应该存在。比隐式的将提供先决条件和命令并且应该起作用。

  3. 由于不带参数的 make 执行文件中的第一个目标,因此您应该移动 $(TARGET): ...规则之前包含或应该定义规则 all: $(TAREGT) (无需执行任何操作,但规则应在开头附近标记为 .phony )。

请注意,您实际上根本不需要进行替换,因为您也不需要使用它的规则。

<小时/>

有时目录需要特殊标志。在这种情况下,您仍然不会为该目录中的文件创建特殊的隐式规则,而是创建特殊的规则来为特定目标在本地设置变量。语法为:

$(OBJS_$(d)): %.o: %.c
specific-command

$(OBJS_$(d)): %.o: CFLAGS=specific-cflags

后者仍然采用一般隐式规则的配方,但定义给定变量的特定于目标的值。我想这就是对无效 $(OBJS_$(d)): $(SRC_$(d)) 的尝试。规则。

这称为static pattern rules在 GNU make 文档中。

关于c - 非递归Makefile编译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19132321/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com