Makefile 为什么选择target';mykernel.bin';失败?

Makefile 为什么选择target';mykernel.bin';失败?,makefile,Makefile,我正在尝试使用Ubuntu创建一个简单的mykernel.bin文件 GPPPARAM = -m32 -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exception -fno-leading-underscore ASPARAMS = --32 LDPARAMS = -m elf_i386 objects = loader.o kernel.o %o: %.cpp g++ $(GPPPARAM) -o $@ -c

我正在尝试使用Ubuntu创建一个简单的mykernel.bin文件

GPPPARAM = -m32 -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exception -fno-leading-underscore
ASPARAMS = --32
LDPARAMS = -m elf_i386
objects = loader.o kernel.o

%o: %.cpp
    g++ $(GPPPARAM) -o $@ -c $<

%o: %.s
    as $(ASPARAMS) -o $@ $<

mykernel.bin : linker.ld $(objects)
    ld $(LDPARAMS) -T $< -o $@ $(objects)
GPPPARAM=-m32-fno使用cxa-atexit-nostdlib-fno内置-fno rtti-fno异常-fno前导下划线
天冬氨酸=--32
LDPARAMS=-m elf_i386
objects=loader.o kernel.o
%o:%的cpp
g++$(GPPPARAM)-o$@-c$<
%o:%
as$(ASPARAMS)-o$@$<
mykernel.bin:linker.ld$(对象)
ld$(LDPARAMS)-T$<-o$@$(对象)
输出为:

生成mykernel.bin
ld-m elf_i386-T linker.ld-o mykernel.bin loader.o kernel.o ld:i386:x86-64输入文件
loader.o”的体系结构与i386输出不兼容
输入文件的ld:i386:x86-64体系结构
kernel.o'与i386输出不兼容 Makefile:13:目标“mykernel.bin”的配方失败
make:**[mykernel.bin]错误1

如果要显示完整的输出,包括目标文件的编译行,那么很明显编译器标志没有用于编译源代码。因此,生成的对象文件是针对本机操作系统的,当您需要32位时,本机操作系统很可能是64位的

原因正如我上面所描述的:您的模式规则是错误的。当您想编写
%时,您已经编写了
%o:%.cpp
。o:%.cpp
。您编写的模式规则告诉make,如果它想构建一个文件
loader.o
(因此模式
%o
的词干与
loader.
)它可以通过编译一个文件
loader..cpp
(因为
%.cpp
中的模式字符
%
替换为词干
加载器。
)。由于没有
loader..cpp
文件,您的模式将被丢弃为不匹配,并继续查找另一个模式,然后作为内置规则找到一个

但是,由于您使用的是非标准变量名
GPPPARAM
,而不是标准的
cxflags
,因此默认规则不使用任何标志

您有两种选择:您可以修复模式规则,使其正确:

%.o: %.cpp
        g++ $(GPPPARAM) -o $@ -c $<

%.o: %.s
        as $(ASPARAMS) -o $@ $<

如果你有问题,请提出来。包括您调用的命令、您得到的输出,以及您不希望得到该输出的原因。只要看一下您的makefile,我就可以看出它是错误的:
%o:%.cpp
应该是
%.o:%.cpp
(注意
%
o
之间的时间段).ld-m elf_i386-T linker.ld-o mykernel.bin loader.o kernel.o ld:i386:x86-64输入文件的体系结构
loader.o'与i386输出不兼容ld:i386:x86-64输入文件的体系结构
kernel.o'与i386输出生成文件不兼容:13:目标'mykernel.bin'的配方生成失败:**[mykernel.bin]错误1请编辑您的问题并将信息放在可以正确格式化的位置,而不是放在评论中。
CXX := g++
CXXFLAGS := -m32 -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exception -fno-leading-underscore

AS := as
ASFLAGS := --32