«Несколько определений» в одной строке в C

#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:

https://pastebin.com/xCcQEtx3

Комментарии:

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 это было причиной ошибки (благодаря Эрику Постпишилу)