Makefile 为什么在gcc和as的标志都不是';不兼容?

Makefile 为什么在gcc和as的标志都不是';不兼容?,makefile,gnu-make,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 $

我想为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
$cat Makefile
ASFLAGS=-m32
全部:程序1程序2
prog2:prog2.o
$make
cc-m32程序1.s-o程序1
as-m32-o程序2.o程序2.s
as:无法识别的选项'-m32'
:目标“prog2.o”的配方失败
make:**[prog2.o]错误1

为什么
make
gcc
as
使用
ASFLAGS
,而它们的标志不兼容?我不应该这样指定体系结构吗?我真的必须破解这个问题吗(即,在我的Makefile中确实写了一些东西),还是我遗漏了什么?

好吧,你骗了
make
as
。如果你把
ASFLAGS
放进了一个不是汇编程序选项的东西,你就做了一些不规范的事情

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


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

因为正如您所提到的,LINK.s(gcc)和COMPILE.s(as)都使用ASFLAGS,一个可能的解决方案是在Makefile中添加以下内容,以便用$(as)编译%.s


这不起作用,因为默认规则中包含了
ASFLAGS
,而不是
CFLAGS
,用于将
%.s
-文件与
gcc
@R.Mitchum Hm进行组合和链接。ASFLAGS不是POSIX,因此很难说在默认规则中应该如何使用它。总之,使用
.POSIX:
作为gnumake文件的第一行是否会有所不同?它将
cc
更改为
c99
,但这不会改变标志的解释。是的,我试图避免做第一件事,但我没有想到第二件事
COMPILE.s+=--32
LDFLAGS=-m32
工作正常!
EXTRA_ASFLAGS = --32
%.o : %.s
        $(AS) $(ASFLAGS) $(EXTRA_ASFLAGS) $(TARGET_MACH) -o $@ $<
COMPILE.s += --32