Почему рецепт для цели 'mykernel.bin' не удался? - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь создать простой файл mykernel.bin, используя Ubuntu.

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)

вывод:

make mykernel.bin ld -m elf_i386 -T linker.ld -o mykernel.bin loader.o kernel.o ld: i386: x86-64архитектура входного файла loader.o' is incompatible with i386 output ld: i386:x86-64 architecture of input file kernel.o 'несовместима с выходными данными i386. Makefile: 13: рецепт для цели' mykernel.bin 'не выполнен make: *** [mykernel.bin] Ошибка 1

1 Ответ

0 голосов
/ 26 мая 2018

Если вы хотите показать полный вывод, включая строки компиляции для ваших объектных файлов, тогда будет ясно, что флаги вашего компилятора не используются для компиляции вашего исходного кода.В результате генерируемые объектные файлы предназначены для вашей собственной операционной системы, которая, скорее всего, является 64-битной, если вам требуется 32-битная.

Причина этого в том, как я описал выше: ваше шаблонное правило неверно.Вы написали %o : %.cpp, когда хотели написать %.o : %.cpp.Написанное вами правило шаблона говорит make, что если он хочет построить файл loader.o (поэтому основа шаблона %o соответствует loader.), он может сделать это, скомпилировав файл loader..cpp (потому что шаблонсимвол % в %.cpp заменяется знаком loader.).Поскольку файла loader..cpp нет, ваш шаблон отбрасывается как несоответствующий, и make продолжает поиск другого шаблона и находит его, как встроенное правило.

Но так как вы используете нестандартную переменнуюимена GPPPARAM вместо стандартных CXXFLAGS, ни один из ваших флагов не используется правилом по умолчанию.

У вас есть два варианта: вы можете либо исправить свои правила шаблона, чтобы они были правильными:

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

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

Или вы можете избавиться от своих собственных правил шаблона и использовать встроенные правила make, а также установить стандартные переменные, чтобы гарантировать использование ваших опций:

CXX := g++
CXXFLAGS := -m32 -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exception -fno-leading-underscore

AS := as
ASFLAGS := --32
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...