我正在尝试创建一个可以相应工作的make文件
OBJECT_DIRECTORY := out/obj
C_SOURCE_FILES = (Path and files fetched from different make files)
CFLAGS += -mcpu=$(CPU) -mthumb -mabi=aapcs -mfloat-abi=soft
CFLAGS += -Wall -Werror
CFLAGS += -D$(DEVICE) -std=gnu99
$(OBJECT_DIRECTORY)/%.o: %.c
$(CC) $(C_SOURCE_FILES) $(CFLAGS) -c -o $@ $<
我验证了C_SOURCE_FILES变量实际上包含c个源文件。这是因为我能够使用这个编译:
$(OBJECT_DIRECTORY)/%.o:
$(CC) $(C_SOURCE_FILES) $(CFLAGS) -c
问题在于目标文件没有放在我需要它们进行链接的文件夹中。
顺便说一下,我正在从Eclipse C / C ++ IDE
执行make文件如果有人能帮我解决这个问题,我会非常高兴。
答案 0 :(得分:1)
试试这个:
$(OBJECT_DIRECTORY)/%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
您不需要C_SOURCE_FILES
变量。此配方将为名为{file} .c的每个文件创建/ obj / {file} .o。
您无法显示它,但是从目标文件创建的可执行文件的依赖项列表必须显式调出每个目标文件。
答案 1 :(得分:0)
我解决了这个问题,我认为......通过创建要在编译中使用的目标文件列表。
# Create the object file names needed for the target. Make needs these file names as target for the compilation
TEMP := $(notdir $(C_SOURCE_FILES:.c=.o))
C_OBJECT_FILES := $(addprefix $(OBJECT_DIRECTORY)/, $(TEMP:.c=.o) )
TEMP_1 := $(notdir $(ASSEMBLER_SOURCE_FILES:.s=.o))
ASSEMBLER_OBJECT_FILES := $(addprefix $(OBJECT_DIRECTORY)/,$(TEMP_1:.s=.o) )
# Tells make to compile all the files in the C_OBJECTS_VARIABLE
all: $(C_OBJECT_FILES)
# Do the compilation of the c files and place the object files in the out/obj folder
$(C_OBJECT_FILES): $(C_SOURCE_FILES)
$(CC) $(CFLAGS) -M $< -MF "$(@:.o=.d)" -MT $@
$(CC) $(CFLAGS) -c -o $@ $<
# Tells make to compile all the files in the ASSEMBLER_OBJECTS_VARIABLE
all: $(ASSEMBLER_OBJECT_FILES)
# Do the compilation of the assembler files and place the object files in the out/obj folder
$(ASSEMBLER_OBJECT_FILES): $(ASSEMBLER_SOURCE_FILES)
$(CC) $(ASMFLAGS) -c -o $@ $<
这种方法运作良好且始终如一。我现在的问题是链接规则根本没有执行......
## Link C and assembler objects to an .out file
$(BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out: $(C_OBJECT_FILES) $(ASSEMBLER_OBJECT_FILES) $(LIBRARIES)
$(CC) $(LDFLAGS) -o $(BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out
我想知道它是否与&#34;所有:&#34;
有关答案 2 :(得分:0)
也找到了解决该问题的方法。我创建了一些新规则以确保链接正在执行。现在make文件运行良好。