为什么 Make 在 gcc 和 as 的标志不兼容时使用 ASFLAGS?



我想从 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

为什么make在标志不兼容时同时对gccas都使用 ASFLAGS?我不应该以这种方式指定架构吗?我真的必须解决这个问题(即在我的 Makefile 中实际编写一些东西)还是我错过了什么?

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

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

COMPILE.s += --32

好吧,你对make撒谎,as.如果你输入ASFLAGS一些不是汇编选项的东西,你就是在做一些不合规格的事情。

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

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

最新更新