2017-04-14 39 views
0

得到评价我是新来的makefile等百分号不生成文件

文件看起来是这样的:

COMPILER_NAME = gcc 
COMPILER_FLAGS = 

PATH_OBJECTS = ./obj 
PATH_SOURCES = ./src 

$(PATH_OBJECTS)/%.o: $(PATH_SOURCES)/%.c 
    $(info Generating object files...) 
    @$(COMPILER_NAME) $(COMPILER_FLAGS) -c $< -o [email protected] 

cleanup: $(PATH_OBJECTS)/%.o 
    $(info Final cleanup...) 
    @rm -rf $< 

当我尝试实际上使这个项目我得到这个错误: 化妆:***没有规则可以使'清理'所需的目标'obj /%。o'成为可能。停止。

这就像%通配符没有得到正确的评估。请帮帮我。

回答

2

模式规则在目标中有'%',并且可能在一个或多个先决条件中。你有什么:

cleanup: $(PATH_OBJECTS)/%.o 
    ... 

不是一个模式规则,'%'不是一个通配符,它​​只是一个字符。这是一个寻找名为“./obj/%”作为先决条件的文件的普通规则,并且没有这样的文件。

如果您想要cleanup删除该目录中的所有目标文件,则不需要任何此复杂功能。只是这样做:

cleanup: 
    @echo Final cleanup... 
    @rm -rf $(PATH_OBJECTS)/*.o 

注意,这里使用的shell命令echo,不Make命令info,壳通配符 '*',而不是制作通配符 '%'。

如果您希望目标依赖所有可以构建的目标文件,则必须自己构建该列表;这并不难,但它看起来并不像你需要的东西。

+0

即使第一个目标不起作用。我的文件夹结构如下: 根 ----斌 ---- OBJ ---- SRC -------- main.c中 但C文件不被编译也不会移动到./obj 此外,如果我尝试删除清理目标,我得到此错误 “make:***没有目标,停止。” 即使目标在那里。 –

+0

@FedericoLuzzi:你误解了模式规则的作用。尝试'make。/ obj/main.o'。 – Beta

+2

关键的理解是,模式规则不会说“找到所有可以构建匹配此模式的文件并构建它们”。模式规则是_template_;它说:“如果你试图建立一个目标,并且它符合这个模式规则,那么你可以使用这个配方来构建它”。您仍然必须单独明确地告诉您要制作哪些目标。 – MadScientist