C Project mit mehreren .c files

Sponny

Lt. Commander
Registriert
März 2008
Beiträge
1.053
Hallo liebe Community,

Mein Hauptprogramm:

#include <stdio.h>
#include "a.c"

int main(){
xxx();
return 0;
}

Mein zweiter .c file "a.c" den ich eingebunden habe.

void xxx () {
...
}

Als Fehler bei dem eingebundenen .c file bekomme ich immer folgenden Fehler:

- first defined here
- multible definition of 'xxx'


Da das mein erstes Project mit mehreren .c files ist, weiß ich leider nicht mehr weiter.
Ich hoffe ihr könnt mir helfen und mir sagen wie ich das lösen kann. :)
Wie man schon sieht, möchte ich gerne die Funktion in meiner Main aufrufen.

Vielen Dank im Voraus.
 
Brauch ich dann nur noch mein Programm mit der Main und die .h datei; oder den a.c file auch noch?
Wäre nett, wenn du es mir ausführlich schritt für schritt erkären könntest. :)
 
Google mal nach Headerdateien. In deiner main.c bindest du nur die a.h ein, die die sogenannten Prototypen für die in der a.c deklarierten Funktionen enthält.
 
In deinem Projekt werden (mindestens) 2 Übersetzungseinheiten kompiliert:

  • main.c
  • a.c

Zusätzlich dazu inkludierst du aber in deiner main.c noch mal deine a.c. Weißt du, was passiert, wenn du in einer Datei eine andere includest? Der Präprozessor führt einfach (vorm Kompilieren) eine textuelle Ersetzung durch, und zwar ersetzt er den Text include "a.c" durch den Inhalt von a.c. Damit enthält deine main.c nun ebenfalls die Definition der Funktion xxx (welche in a.c ja auch bereits definiert ist).

Nach dem Kompilieren kommt nun der Linker dran und knüpft quasi die beim Kompilieren entstandenen object-Files (Endung .o) zu einer ausführbaren Datei zusammen. Nun merkt der Linker plötzlich, daß es für Funktion xxx mehrere Definitionen gibt; ein mal in main.c und ein mal in a.c ... also beschwert er sich bei dir.

Deshalb inkludiert man Dateien, die im Projekt/Makefile bereits als zu übersetzende Einheiten existieren, niemals in einer anderen Übersetzungseinheit. Wie herrhannes bereits vorgeschlagen hat, solltest du stattdessen den Prototypen der Funktion xxx in einen Header a.h auslagern und den dann in main.c inkludieren.
 
Zurück
Oben