【发布时间】:2016-07-27 21:59:44
【问题描述】:
我在 Makefile 中有几行正在编译和生成 .o 和 .d 文件。我想要制作两组.o.d,例如:
name.d
name_hello.d
name.o
name_hello.o
已经找到如何使用"$(@:.o=_hello.d)" 更改.d 的名称,但更改没有成功。o 也许我需要使用$@,但不知道该怎么做。
这是制作文件的代码:
$(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-none-eabi-gcc.exe 用于 ARM,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 help 中写的,我正在阅读它,但仍然无法找到答案
更新 3
这是我修改 'C_OBJECTS' 的方法,似乎可行:
C_OBJECTS_hello = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILENAMES:.c=_hello.o) )
【问题讨论】:
-
但没有成功更改
.o- 将其更改为什么? -
我的目标是同时拥有 *.o 和 *_hello.o 文件。
-
你当然可以创建一个
$(C_OBJECTS_hello)变量,但是创建一个变量并不意味着它以后会被使用。您应该检查C_OBJECTS现在在哪里使用,并考虑$(C_OBJECTS_hello)的含义。我们不知道您如何使用$(C_OBJECTS)或_hello.o有什么特别之处,所以我们的建议就差不多了。 -
'C_OBJECTS' 由 gcc 使用,我在 'Update 2' 中对此进行了描述。感谢您的帮助@MSalters