2017-12-10 3 views
0

Derzeit versuche ich, GCC auf Debian zusammen mit einem Makefile zu verwenden, da ich einen meiner Header mache. Jedes Mal, wenn ich versuche, die Make-Datei zu "machen", bekomme ich einen Fehler wie folgt:GCC und Makefile (mehrere Deklarationen einer Funktion, sogar mit nur einem?)

setup.o: In der Funktion 'Setup':

setup.c :(text + 0x0.): Mehrere Definition von `setup‘

finalkek.o: finalkek.c :(text + 0x0.): zuerst hier definiert

collect2: *** [projExec] Fehler: ld 1 Exit-Status

make zurück 1

Mein Make-Datei sieht wie folgt aus:

projExec: finalkek.o setup.o 
    gcc -o projExec finalkek.o setup.o 

finalkek.o: finalkek.c setup.h 
    gcc -c finalkek.c 

setup.o: setup.c 
    gcc -c setup.c 

finalkek.c meine Hauptdatei ist, und setup ist mein Header.

In meinem Haupt-Datei, hier das einzige Mal, dass ich es zu erwähnen ist:

include "setup.h" // Using the double quotes for a custom header... 

void main() 
{ 

setup(); 

     rest of code here... 

} 

In meiner Header-Datei, setup.h, ich habe es wie folgt aus:

void setup() 
{ 

     rest of code here... 

} 
+2

Warum haben Sie Ihre Implementierung Ihrer 'Setup()' Funktion in 'setup.h'? Was ist in 'setup.c'? (Ist es ein Tippfehler?). Ihr Problem ist wahrscheinlich ein mehrfacher Importfehler. Wir können Ihnen eine definitive Antwort geben, wenn Sie die entsprechenden Änderungen vornehmen. – KyrSt

+4

Obwohl es nicht mit dem Problem zusammenhängt, sollte 'void main()' 'int main (void)' sein.Wenn du ein Buch oder eine Anleitung hast, die dir 'void main()' sagt, finde einen besseren, dessen Autor C. kennt. –

+0

Außerdem habe ich "Debian" sowohl aus dem Titel als auch aus dem Tag herausgeschnitten, da es fast sicher irrelevant ist. Plus, bitte posten Sie alle Code (einschließlich Makefiles) in den Beitrag selbst und nicht als Screenshot – KyrSt

Antwort

0

Ein paar Dinge, die ich bemerkt, : Obwohl es technisch erlaubt ist, ist es eine fehlerhafte Vorgehensweise, die gesamte Funktion in einer Header-Datei zu implementieren. Header-Dateien sind nur für die Prototypen (d. H. void setup(void); anstelle der gesamten void setup(void) { ... }). Was ist in deiner setup.c? Außerdem sollte Make nicht so funktionieren.

finalkek.o: finalkek.c setup.h 
    gcc -c finalkek.c 

Sie sollen nicht eine Header-Datei direkt kompilieren, da es nicht angenommen hat, tatsächliche Implementierungen in ihm hat, sondern nur die Prototypen. Das macht der Präprozessor mit der Direktive #include, er nimmt den gesamten Inhalt des angegebenen Headers und legt ihn genau dort in die C-Datei. Wenn Sie also make anweisen, compile setup.h zu kompilieren, fügen Sie den Inhalt dieser Datei zweimal in Ihr Projekt ein, wodurch Sie wahrscheinlich den Fehler erhalten.

Wie andere gesagt haben, verschieben Sie Ihren tatsächlichen Code für die Funktion setup() nach setup.c, wie es angemessen ist. setup.h sollte wie folgt aussehen:

#ifndef SETUP_H 
#define SETUP_H 

void setup(void); 

#endif 

Die Linien #ifndef SETUP_H, #define SETUP_H und #endif, sind ein Formatierungstool für Header-Dateien, die Sie halten die gleiche Datei mehr als einmal von einschließlich.

Und dann die begleitenden setup.c:

#include "setup.h" 

void setup(void) { 
    // your code here 
} 

finalkek.c:

int main(void) { 
    setup(); 

    // rest of code here 
} 
Verwandte Themen