为什么Make使用ASFLAGS用于gcc以及当它们的标志不兼容时?

时间:2016-02-12 12:22:04

标签: makefile gnu-make

我想从64位主机组装并链接一些32位目标的代码,并且我尽可能地尝试使用make的隐式规则。

如果我将-m32放入ASFLAGS,它可以在一个步骤中正常链接和汇编,因为make将使用gcc。但是,如果我的某个可执行文件需要单独链接,则所有内容都会中断,因为make将使用as进行汇编,而as无法理解-m32。要解决此问题,我可以使用--32,但这当然不适用于gcc

$ cat Makefile
ASFLAGS = -m32

all: prog1 prog2

prog2: prog2.o

$ make
cc -m32   prog1.s   -o prog1
as -m32  -o prog2.o prog2.s
as: unrecognized option '-m32'
<builtin>: recipe for target 'prog2.o' failed
make: *** [prog2.o] Error 1

为什么makeASFLAGSgcc标记不兼容时使用as?我不应该以这种方式指定架构吗?我是否真的必须破解我的方式(即实际上在我的Makefile中写一些东西),或者是否有我错过的东西?

2 个答案:

答案 0 :(得分:1)

由于您提到的LINK.s(gcc)和COMPILE.s(as)都使用了ASFLAGS,因此一种可能的解决方案是在Makefile中添加以下内容,以便用$(AS)编译%.s,

EXTRA_ASFLAGS = --32
%.o : %.s
        $(AS) $(ASFLAGS) $(EXTRA_ASFLAGS) $(TARGET_MACH) -o $@ $<

,或

COMPILE.s += --32

答案 1 :(得分:0)

好吧,你骗了makeas。如果您输入的ASFLAGS某些东西不是汇编程序选项,那么您就可以执行超出规范的操作。

make无法知道编译器和汇编器理解的选项。为了解决这个问题,make提供了一种分别为每个工具指定选项的方法:对编译器使用CFLAGS,为汇编程序使用ASFLAGS,为链接步骤使用LDFLAGS

我建议使用make CFLAGS=-m32 ASFLAGS=--32