Hallo, ihr.
Nachdem ich mich eine Zeit lang nur mit Theorie und Assembyl beschäftigt habe grub ich gestern einen "meiner" (das meiste ist "übernommen"...aber verstehen tue ich es schon) alten C-Kernel wieder aus plötzlich sagte er mir ld
kernel.o(.data+0x0): multiple definition of `VideoMem'
video.o(.data+0x0): first defined here
kernel.o(.bss+0x0): multiple definition of `VideoPos'
video.o(.bss+0x0): first defined here
Was doch darauf schließen lässt das er die Datei "video.h" (wo VideoMem und VideoPos definiert sind) 2 mal includiert oder? Tja, hier kommt der Sourcecode:
video.h :
#ifndef HELIOS_VIDEO_H
#define HELIOS_VIDEO_H
// Format : COLOR_BACK_FORE
#define COLOR_BLACK 0xF0
#define COLOR_BLUE 0xF1
#define COLOR_GREEN 0xF2
#define COLOR_TUERKIS 0xF3
#define COLOR_RED 0xF4
#define COLOR_MAGENTA 0xF5
#define COLOR_BROWN 0xF6
#define COLOR_LIGHTGRAY 0xF7
#define COLOR_DARKGRAY 0xF8
#define COLOR_LIGHTBLUE 0xF9
#define COLOR_LIGHTGREEN 0xFA
#define COLOR_LIGHTTUERKIS 0xFB
#define COLOR_LIGHTRED 0xFC
#define COLOR_LIGHTMAGENTA 0xFD
#define COLOR_YELLOW 0xFE
#define COLOR_WHITE 0xFF
// Variables
char *VideoMem = (char *) 0xb8000;
unsigned int VideoPos = 0;
void ClearScreen(char Color);
unsigned int PrintMsg(char *Msg, char Color);
#endif
video.c :
#include <video.h>
void ClearScreen(char Color)
{
VideoPos = 0;
while(VideoPos < (80 * 25 * 2))
{
VideoMem[VideoPos] = ' ';
VideoPos++;
VideoMem[VideoPos] = Color;
VideoPos++;
};
VideoPos = 0;
};
unsigned int PrintMsg(char *Msg, char Color)
{
while(*Msg)
{
if(*Msg == '\n')
{
VideoPos = (((VideoPos / 160) + 1) * 160) + (VideoPos % 160);
}
else
{
VideoMem[VideoPos] = *Msg;
*Msg++;
VideoPos++;
VideoMem[VideoPos] = Color;
VideoPos;
};
};
return(1);
};
kernel.c :
#include <video.h>
k_main()
{
ClearScreen(COLOR_BLACK);
PrintMsg("Hello, World!", COLOR_BLUE);
};
das Makefile (es sind nur ein paar schnell reingetippte Befehle) :
all:
gcc -ffreestanding video/video.c -c -I./video/
gcc -ffreestanding kernel.c -c -I./video/
nasm k_init.asm -f aout
ld -T Link.ld k_init.o video.o kernel.o -o kernel
nasm boot.asm -o boot.bin
cat boot.bin kernel > kernel.img
rm boot.bin
rm kernel
rm kernel.o
rm k_init.o
Ich hoffe jemand kann mir helfen, Danke jedenfalls schon im vorraus.