#c #kernel
#c #ядро
Вопрос:
Итак, я создаю функцию с именем reboot, но когда я ее определяю, компилятор выдает ошибку, как будто функция уже определена.
Вот bios.c:
#include "bios.h"
#include <stdint.h>
#include <libasm/asm.h>
void reboot()
{
uint8_t good = 0x02;
while (good amp; 0x02)
good = EmeraldASM_inb(0x64);
EmeraldASM_outb(0x64, 0xFE);
asm volatile("hlt");
}
вот bios.h :
#ifndef BIOSPOWER_H
#define BIOSPOWER_H
#pragma once
void reboot();
extern void shutdown();
#endif
вот ошибка компилятора: /home/abbix/Documents/Projects/emerald/src/firmware/bios.c:5: multiple definition of `reboot'; src/firmware/bios.o:/home/abbix/Documents/Projects/emerald/src/firmware/bios.c:5: first defined here
Вот мой Makefile:
Комментарии:
1. это полное сообщение? возможно, должно быть примечание ко второму определению
2. Опубликуйте свой журнал сборки (это журнал сборки, а не журнал компиляции, потому что он выполняет всю сборку, включая компоновку, а не только компиляцию) как скопированный и вставленный текст в вопросе, а не как ссылку на изображение с уменьшенным разрешением на внешнем сайте.
make clean
Сначала выполните. Вы можете использовать<pre>
</pre>
теги и при отправке текста в Stack Overflow, чтобы пометить его как выполненный текст.3. или у вас тоже может быть
#include "bios.c"
где-то.4. Почему между и есть пустая строка
$(KERNEL_ELF): $(OBJ)
@$(LD) $(LDHARDFLAGS) $(OBJ) -o $@
?5. @Abb1x: Цель выполнения
make clean
перед созданием журнала сборки состоит не в том, чтобы убедиться, что какой-то старый неправильный промежуточный файл не валяется, а в том, чтобы убедиться, что все команды выполняются снова, чтобы мы могли видеть их в журнале сборки.
Ответ №1:
Проблема заключалась в том, что мой файл сборки имел имя bios.asm, поэтому он создал два bios.o это было причиной ошибки (благодаря Эрику Постпишилу)