Fragen Header & Source Datei und nicht-inline Funktionen

Clund

(aka Cpp-Freak)
Sooo, hallo zusammen,
ich bin gerade dabei ein eigenes "iostream" für mein eigenes System zu Programmieren (siehe Anhang).
Aber wie definiert man Funktionen, die nicht inline sind? (in meinem Fall soll imks-libs.c einfach in mein "main.c" vom Kernel eingebunden werden) Wenn ich jetzt z.B. meine Hauptdatei "imks-libs.c" habe:
C++:
#include "syscall.h"
#include "syscall.c"
und "syscall.h":
C++:
#ifndef SYSCALL_H_INCLDED
#define SYSCALL_H_INCLDED
int syscall_al_ah_bx_cx_dx(_bit8 numbera/*al*/, _bit8 nummerb /*ah*/, _bit16 bx, _bit16 cx, _bit16 dx);
#endif /*syscall-h-included*/
, dann müsste "syscall.c" doch folgendermaßen aussehen:
C++:
#include "syscall.h"

int syscall_al_ah_bx_cx_dx(_bit8 numbera/*al*/, _bit8 nummerb /*ah*/, _bit16 bx, _bit16 cx, _bit16 dx)
{
    return 0; //0=no_problem
};

aber der Compiler (Codeblocks, gcc) gibt mir folgende Fehlermeldung aus:
Code:
obj/Debug/syscall.o||In function `syscall_al_ah_bx_cx_dx':|
/media/SIMONDZ/JuFo/imks-libs-dev/imks-libs-dev/syscall.c|5|multiple definition of `syscall_al_ah_bx_cx_dx'|
obj/Debug/imks-libs.o:/media/SIMONDZ/JuFo/imks-libs-dev/imks-libs-dev/syscall.c|5|first defined here|
/usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../x86_64-linux-gnu/crt1.o||In function `_start':|
(.text+0x20)||undefined reference to `main'| <--das hier kommt daher, dass ich kein main() habe und ist mehr oder weniger gewollt
||=== Build finished: 3 errors, 0 warnings ===|
wenn ich "syscall.c" nicht in "imks-libs.c" einbinde kommen die Fehlermeldungen nicht, ebenso, wenn ich "syscall.c" ganz weglasse und die Funktion in die Header-Datei ganz reinschreibe.
Beim Googlen bin ich auf irgendwas mit Bibliotheken gestoßen (heißt das jetzt ich brauche Bibliotheken?), hab es aber nicht ganz verstanden (auf Englisch).
wie bekomme ich es also richtg hin, dass die Funktionen kein Inline sind?
Mfg
Clund

P.S. wenn mir jemand nicht folgen kann, dann möge er sich melden und ich beschreibe mein Problem noch ausführlicher
 
Zuletzt bearbeitet:
Hi

warum inkludierst du die c-Datei?
Du schreibst ja selber, ohne diesem Include funktionierts.
Zum Inkludieren sind nur die h-Dateien.
 
aber wenn die c Dateien nicht includiert werden, dann bringen sie doch nix :D
oder habe ich da was falsch verstanden?
Clund
 
Wenn du Dateien kompilierst, dann gibst du doch an, auf welche Dateien er zurückgreifen muss:
Code:
gcc -o {Name der Binärdatei} {Datei 1.c} {Datei 2.c} {...}
 
Moin,
ich verwende Codeblocks und die ganzen files sollen dann in /usr/include/imks-libs-dev/ ligen. "imks-libs.c" soll dann von den Normalen Projekten (wie iostream) eingebunden werden (dafür habe ich auch schon makefile, etc wo ich deinen speziellen Befehl verwenden kann)
kann man alle *.c Dateien in eine zusammenfassen, und diese dann gcc übergeben?
Clund
 
Kann man. Aber wozu dann überhaupt noch h-Dateien?
Und die Übersichtlichkeit wird darunter sehr leiden...

Zum "Falsch verstanden"-Post: Vermutlich.
Du musst wirklich nur die h-Dateien inkludieren.
Die c-Dateien werden alle einzeln kompiliert und dann zusammengelinkt.
 
also im großen und ganzen habe ich dann 1 Datei die ich includiere (imks-libs.c)
und noch ne Datei, in der alle .c Dateien includiert sind, die ich dem Compiler übergebe, oder?
soll ich imks-libs.c dann besser in imks-libs.h umbenennen und imks-libs.c (wo alle .c eingebunden sind) dem Compiler übergeben?
Edit: in den .h Dateien sind wichtige structs drinne
Edit, die zweite: ich kann trotzdem (wegen den structs) noch die .h Dateien in die .c Dateien includieren, oder?
 
Nein, keine C-Dateien includieren. Auch nicht in h umbenennen.

Warum willst du nicht einfach mehrere c-Dateien beim kompilieren angeben,
so wie crack gezeigt hat?
 
ja, ok mach ich, es können nur endlos viele werden....
(erstmal erledigt)

Clund
 
Zuletzt bearbeitet:
Zurück