2016-07-27 154 views
0

我在Makefile中有几行正在编译和生成.o.d文件。我想制作两套.o.d,是这样的:使用Makefile和gcc重命名.o文件

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

已经找到了如何使用"$(@:.o=_hello.d)"改变.d的名称,但没有成功改变的.o也许我需要[email protected]玩,但不知道如何去做吧。

下面是制作文件代码:

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

我用arm-none-eabi-gcc.exe武器和make.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 

我知道,这是写在化妆的帮助,我读它,但还是没能找到答案


更新3

这是我如何修改“C_OBJECTS ',似乎这个作品:

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

_但没有成功改变'.o'_ - 改变它为什么? –

+0

我的目标是拥有* .o和* _hello.o文件。 –

+1

http://stackoverflow.com/a/7358961/412080 –

回答

1

你确实会使用替换。 [email protected]变量扩展了所有%.o匹配项。这就是为什么你有一个$(@:.o=.d)替代;您需要为每个%.o匹配一个.d文件。

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

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

+0

它甚至不是_secondary_输出,因为make完全不知道它。 –

+0

@MaximEgorushkin:对,应该将其列为输出。 – MSalters

+0

请看看,我为该主题进行了更新。 * _hello.o单独目标,但目标从未使用过。 –

1

你的makefile规则产生的文件比make知道的要多。 $(OBJECT_DIRECTORY)/%.o: %.c表示它从.c构建一个.o,而您希望它构建4个文件。

你需要让make知道哪些文件,其规则产生的,因此,它可以建立一个完整的依赖关系图:

$(OBJECT_DIRECTORY)/%.o $(OBJECT_DIRECTORY)/%.d: %.C# Compile and build dependencies. 
    $(CC) -c -o [email protected] $(CFLAGS) $(INCLUDEPATHS) -MD -MP $< 

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

注意,这些规则不明确命名.d输出文件,让编译器确定它用.d代替.o

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

请注意,你不应该需要在https://stackoverflow.com/a/7358961/412080所陈述的理由自动生成的依赖关系明确的规则。

+0

感谢这很有用,我做了两个目标,似乎产生两套文件,因为我需要。 –