我在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.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
中的某种过滤器会告诉CC
(arm-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) )
答案 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中所述的原因,您不需要显式自动生成依赖关系的规则。