多目标的Makefile(目录中asm文件的全局)

多目标的Makefile(目录中asm文件的全局),makefile,gnu-make,Makefile,Gnu Make,我是新手。我在一个目录中有一堆FOO.32.asm和FOO.64.asm文件。我想要一个Makefile,它可以根据需要将它们组装成FOO.32.o或FOO.64.o,然后将它们链接到FOO.32或FOO.64可执行文件中 我认为静态模式可能是答案的一部分,比如: %.32.o : %.32.asm nasm -f elf -gstabs $< %.64.o : $.64.asm nasm -f elf64 -gstabs $< 有什么想法吗?首先查找所有源文件:

我是新手。我在一个目录中有一堆FOO.32.asm和FOO.64.asm文件。我想要一个Makefile,它可以根据需要将它们组装成FOO.32.o或FOO.64.o,然后将它们链接到FOO.32或FOO.64可执行文件中

我认为静态模式可能是答案的一部分,比如:

%.32.o : %.32.asm
    nasm -f elf -gstabs $<

%.64.o : $.64.asm
    nasm -f elf64 -gstabs $<

有什么想法吗?

首先查找所有源文件:

src32 := $(wildcard *.32.asm)
src64 := $(wildcard *.64.asm)
接下来,创建依赖于对象文件的目标,并具有依赖于这两个文件的初始规则,以便在默认情况下生成这两个文件:

all: output.32 output.64

output.32 : $(src32:.asm=.o)
        gcc -m32 -o $@ $^
output.64 : $(src64:.asm=.o)
        gcc -o $@ $^
并在上面添加模式规则:

%.32.o : %.32.asm
        nasm -f elf -gstabs $<

%.64.o : %.64.asm
        nasm -f elf64 -gstabs $<
%.32.o:%.32.asm
nasm-f elf-gstabs$<
%.64.o:%.64.asm
nasm-f elf64-gstabs$<
ETA

如果要为每个对象文件创建一个二进制文件,这也很简单:

src32 := $(wildcard *.32.asm)
src64 := $(wildcard *.64.asm)

all: $(src32:.asm=) $(src64:.asm=) $(src32:.asm=.o) $(src64:.asm=.o)

%.32 : %.32.o
        gcc -m32 -o $@ $^

%.64 : %.64.o
        gcc -o $@ $^

%.32.o : %.32.asm
        nasm -f elf -gstabs $<

%.64.o : %.64.asm
        nasm -f elf64 -gstabs $<
src32:=$(通配符*.32.asm)
src64:=$(通配符*.64.asm)
全部:$(src32:.asm=)$(src64:.asm=)$(src32:.asm=.o)$(src64:.asm=.o)
%.32:%.32.o
gcc-m32-o$@$^
%.64:%.64.o
gcc-o$@$^
%.32.o:%.32.asm
nasm-f elf-gstabs$<
%.64.o:%.64.asm
nasm-f elf64-gstabs$<
就这样!有一些更奇特的方法可以做到这一点,允许您只使用一个模式规则来构建对象,使用一个模式规则来构建所有可执行文件,但上面的方法很简单,也可以理解


如果要保持对象文件进行调查,则需要将对象文件添加到<代码>所有< /代码>目标(或者,一些目标:它不必是代码>所有< /代码>),否则将考虑它们中间文件,并自动删除它们。通过将对象文件列为明确的先决条件,make知道您想保留它们。

谢谢,到此为止!看起来链接只发生一次,所有对象文件都作为输入,但我认为链接器需要为每个文件运行一次——每个文件都将生成一个可执行文件。以下是我看到的两个.64.asm文件存在时的输出:
make nasm-f elf64-gstabs rax-mov.64.asm nasm-f elf64-gstabs rax-xor.64.asm gcc-o output.64 rax mov.64.o rax xor.64.o/usr/bin/ld:rax xor.64.o:rax xor.64.asm:5:main的多个定义;rax mov.64.o:rax mov.64.asm:5:首先在此处定义collect2:错误:ld返回了1个退出状态make:**[Makefile:11:output.64]错误1
很抱歉,您的问题不清楚。我以为您想编译所有的.o,然后将它们链接到一个可执行文件中。如果要将每个.asm文件编译成单独的可执行文件(因此,如果有10个asm文件,则会得到10个可执行文件),为什么要创建对象文件?为什么不直接从源代码构建可执行文件呢?公平的问题:)我正在学习asm,并且喜欢区分由稍微不同的指令生成的对象文件,检查生成的机器代码。可执行文件有这么多样板文件,通读较小的对象文件就更好了。对不起,问题不清楚。谢谢你的最新答案!
src32 := $(wildcard *.32.asm)
src64 := $(wildcard *.64.asm)

all: $(src32:.asm=) $(src64:.asm=) $(src32:.asm=.o) $(src64:.asm=.o)

%.32 : %.32.o
        gcc -m32 -o $@ $^

%.64 : %.64.o
        gcc -o $@ $^

%.32.o : %.32.asm
        nasm -f elf -gstabs $<

%.64.o : %.64.asm
        nasm -f elf64 -gstabs $<