使用Makefile和gcc重命名.o文件

时间:2016-07-27 10:41:04

标签: gcc makefile linker

我在Makefile中有几行正在编译并生成.o.d个文件。我希望生成两组.o .d,例如:

name.d
name_hello.d
name.o
name_hello.o

已经找到了如何使用.d更改"$(@:.o=_hello.d)"的名称,但没有成功更改.o也许我需要使用$@,但不知道该怎么做。

这是Make文件代码:

$(OBJECT_DIRECTORY)/%.o: %.c
# Build header dependencies
    $(CC) $(CFLAGS) $(INCLUDEPATHS) -M $< -MF "$(@:.o=.d)" -MT $@
    $(CC) $(CFLAGS) $(INCLUDEPATHS) -M $< -MF "$(@:.o=_hello.d)" -MT $@
# Do the actual compilation
    $(CC) $(CFLAGS) $(INCLUDEPATHS) -c -o $@ $<
    $(CC) $(CFLAGS) $(INCLUDEPATHS) -c -o $@ $< - this line i want to change

我对ARM使用arm-none-eabi-gcc.exemake.exe

更新

似乎使用单独的目标是比改变名称更好的解决方案。所以,我为它做了单独的目标。但它永远不会被使用。在Makefile的其他位置,有下一行代码告诉编译器要使用的.o文件:

C_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILENAMES:.c=.o) )

我想我需要将其更改为:

C_OBJECTS_hello = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILENAMES:.c=*_hello.o) )

请告诉如何修改C_OBJECTS以使编译器使用*_hello.o个文件

更新2

这是C_OBJECTS使用的方式,我想C_OBJECTS中的某种过滤器会告诉CCarm-none-eabi-gcc.exe)使用某些.o文件。由于过滤器中未使用*_hello.o个文件,因此它们也不会在目标中生成。

## Link C and assembler objects to an .out file
$(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out: $(BUILD_DIRECTORIES) $(C_OBJECTS) $(ASSEMBLER_OBJECTS) $(LIBRARIES)
    $(CC) $(LDFLAGS) $(C_OBJECTS) $(ASSEMBLER_OBJECTS) $(LIBRARIES) -o $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out

我知道这是写在make帮助中我正在读它,但仍然无法找到答案

更新3

以下是我修改'C_OBJECTS'的方法,看起来有效:

C_OBJECTS_hello = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILENAMES:.c=_hello.o) )

2 个答案:

答案 0 :(得分:1)

你确实会使用替代品。 $@变量会扩展所有%.o个匹配项。这就是你有$(@:.o=.d)替换的原因;每个.d匹配都需要%.o个文件。

在这种情况下,您确实可以使用$(@:.o=_hello.o)替换。请注意,这不是%.c输入的依赖项;它是次要输出。

另一种方法是添加第二个输出$(OBJECT_DIRECTORY)/%.o $(OBJECT_DIRECTORY)/%_hello.o: %.c。在这种情况下,您不会使用$@,而是使用匹配的$* %。因此,您的两个依赖项文件将是$(OBJECT_DIRECTORY)/$*.d$(OBJECT_DIRECTORY)/$*_hello.d

答案 1 :(得分:1)

您的makefile规则生成的文件数量超过make所知道的数量。 $(OBJECT_DIRECTORY)/%.o: %.c表示它会从.o构建一个.c,而您希望它构建4个文件。

您需要让make知道其规则生成的文件,以便它可以构建完整的依赖关系图:

$(OBJECT_DIRECTORY)/%.o $(OBJECT_DIRECTORY)/%.d: %.c # Compile and build dependencies.
    $(CC) -c -o $@ $(CFLAGS) $(INCLUDEPATHS) -MD -MP $<

$(OBJECT_DIRECTORY)/%_hello.o $(OBJECT_DIRECTORY)/%_hello.d: %.c # Compile and build dependencies.
    $(CC) -c -o $@ $(CFLAGS) $(INCLUDEPATHS) -MD -MP $<

请注意,这些规则没有明确命名.d输出文件,让编译器通过将.o替换为.d来确定它。

现在您有两个规则而不是一个make可以在使用-j标志时并行执行它们。

请注意,出于https://stackoverflow.com/a/7358961/412080中所述的原因,您不需要显式自动生成依赖关系的规则。