我的Makefile遇到了麻烦: - (
我需要将汇编和C源代码混合在一起。我需要针对这两种类型的不同构建指令。由于汇编程序和C编译器输出* .o文件,我不能使用示例Makefiles中常见的%.o:%。c构造
这就是我现在正在尝试的事情:
获取所有C文件及其生成的输出文件的列表:
C_SRCFILES := $(shell find $(SRCDIRS) -type -f -name "*.c")
C_OBJFILES := $(patsub %.c,%.o,$(C_SRCFILES))
获取所有asm文件及其生成的输出文件的列表:
A_SRCFILES := $(shell find $(SRCDIRS) -type -f -name "*.asm")
A_OBJFILES := $(patsub %.asm,%.o,$(A_SRCFILES))
当我将这些变量回显到屏幕时,它们似乎是正确的,但我现在如何定义目标?
我试过这样的事情
$(A_OBJFILES): ($A_SRCFILES)
$(AS) $(AFLAGS) -o $@ $*
$(C_OBJFILES): ($C_SRCFILES)
$(CC) $(CFLAGS) -c -o $@ $*
all: $(A_OBJFILES) $(C_OBJFILES)
$(LD) $(LDFLAGS) $(A_OBJFILES) $(C_OBJFILES) -o $(TARGET_OUTPUT)
但是当然,这不起作用......
有什么建议吗?
答案 0 :(得分:4)
第一个问题:错误的括号或两个。
$(A_OBJFILES): ($A_SRCFILES)
请注意$
中的(
内有($A_SRCFILES)
。扩展$A
,这是什么都没有,事情发生了变化。我认为你的意思是$(A_SRCFILES)
,而另一个规则也是如此。
第二个问题:我不知道汇编程序的语法,但编译器命令的语法错误:
$(CC) $(CFLAGS) -c -o $@ $*
如果我们不在模式规则中,那么变量$*
就没有了,我们还没有。无论如何,如果我们处于模式规则中并且您尝试构建foo.o
,则此命令将查找源文件foo
,并且没有此类文件。这样做:
$(CC) $(CFLAGS) -c -o $@ $<
第三个问题:每个目标文件都依赖于所有源文件(在每个规则中)。试试这个:
$(A_OBJFILES): %.o : %.asm
...
$(C_OBJFILES): %.o : %.c
...
(现在这是一种模式规则。)
第四个问题:最后一条规则中有很多冗余。将其更改为:
all: $(A_OBJFILES) $(C_OBJFILES)
$(LD) $(LDFLAGS) $^ -o $(TARGET_OUTPUT)
或更好:
all: $(TARGET_OUTPUT)
$(TARGET_OUTPUT): $(A_OBJFILES) $(C_OBJFILES)
$(LD) $(LDFLAGS) $^ -o $@
答案 1 :(得分:2)
由于汇编程序和C编译器输出* .o文件,我不能使用示例Makefiles中常见的%.o:%。c构造
当然可以:
%.o : %.c
# commands to make .o from a corresponding .c
%.o : %.asm
# commands to make .o from a corresponding .asm