undefined reference to main...



  • Hallo!
    Zurzeit lernen wir C-Programmierung unter Benutzung von Linux.
    Habe hier vier Dateien: main.c Test.c Print.c

    die main sieht in etwa so aus:

    int main() {   
    
       //Formatierte Ein- und Ausgabe: scanf, printf
       PrintResult("Format IO Test", TestFormatIO());
    
       //Stringoperationen
       PrintResult("String Test", TestString());
    
       //Dateioperationen
       PrintResult("File Test", TestFileOp("text.txt"));
    
    ...
    
    	return 0;
    }
    

    wenn ich gcc main.c eingebe kriege ich folgendes:

    bsy3@bsy3:~/Workspace/Übung2$ gcc main.c
    /tmp/ccK9Food.o: In function main': main.c:.text+0xa): undefined reference toTestFormatIO'
    main.c:.text+0x1a): undefined reference to PrintResult' main.c:.text+0x1f): undefined reference toTestString'
    main.c:.text+0x2f): undefined reference to PrintResult' main.c:.text+0x3b): undefined reference toTestFileOp'
    main.c:.text+0x4b): undefined reference to PrintResult' main.c:.text+0x50): undefined reference toTestDynMem'
    main.c:.text+0x60): undefined reference to PrintResult' main.c:.text+0x65): undefined reference toTestStruct'
    main.c:.text+0x75): undefined reference to PrintResult' main.c:.text+0x7a): undefined reference toTestArray'
    main.c:.text+0x8a): undefined reference to PrintResult' main.c:.text+0x8f): undefined reference toTestFuncPtr'
    main.c:.text+0x9f): undefined reference to `PrintResult'
    collect2: error: ld returned 1 exit status
    [1]+ Done gedit main.c Print.c Test.c

    wenn ich die anderen dateien zum kompilieren gebe kriege ich dasselbe

    die aufgabenstellung lautet:
    fehlerhaftes code zum ausführen bringen (logikfehler und syntaxfehler)



  • ACnut schrieb:

    Hallo!
    Habe hier vier Dateien: main.c Test.c Print.c

    Das waren nur zwei.

    ACnut schrieb:

    die main sieht in etwa so aus:

    int main() {   
    
       //Formatierte Ein- und Ausgabe: scanf, printf
       PrintResult("Format IO Test", TestFormatIO());
    
       //Stringoperationen
       PrintResult("String Test", TestString());
    
       //Dateioperationen
       PrintResult("File Test", TestFileOp("text.txt"));
    
    ...
    
    	return 0;
    }
    

    Nix inkludiert?

    [quote="ACnut"]
    wenn ich gcc main.c eingebe kriege ich folgendes:

    bsy3@bsy3:~/Workspace/Übung2$ gcc main.c
    /tmp/ccK9Food.o: In function main': main.c:.text+0xa): undefined reference toTestFormatIO'
    main.c:.text+0x1a): undefined reference to `PrintResult'
    ...

    gcc main.c anderedatei.c nochanderedatei.c



  • gcc main.c weist den Compiler an, die Datei main.c zu compilieren und zu linken. Beim Linken versucht er, die Funktionen zu finden, findet sie aber nicht.

    Es gibt 2 Möglichkeiten. Entweder jede Sourcedatei einzeln erst nur compilieren, indem die Opition -c übergeben wird, und dann alle entstandenen Objektdateien zusammen linken oder gleich alle Sourcedateien mit einem Aufruf compilieren und linke. Also:

    gcc -c main.c
    gcc -c Test.c
    gcc -c Print.c
    gcc main.o Test.o Print.o
    

    Oder mit einem Aufruf:

    gcc main.c Test.c Print.c
    

    Beides erzeugt eine auführbare Datei a.out . Den Namen kannst Du mit der Option -o ändern, also etwa:

    gcc -o myprog main.o Test.o Print.o
    

    Dann entsteht eine ausführbare Datei myprog



  • [quote="volkard"]

    ACnut schrieb:

    Hallo!
    Habe hier vier Dateien: main.c Test.c Print.c

    Das waren nur zwei.

    ACnut schrieb:

    die main sieht in etwa so aus:

    int main() {   
    
       //Formatierte Ein- und Ausgabe: scanf, printf
       PrintResult("Format IO Test", TestFormatIO());
    
       //Stringoperationen
       PrintResult("String Test", TestString());
    
       //Dateioperationen
       PrintResult("File Test", TestFileOp("text.txt"));
    
    ...
    
    	return 0;
    }
    

    Nix inkludiert?

    natürlich wurden die header inkludiert

    tntnet schrieb:

    gcc main.c weist den Compiler an, die Datei main.c zu compilieren und zu linken. Beim Linken versucht er, die Funktionen zu finden, findet sie aber nicht.

    Es gibt 2 Möglichkeiten. Entweder jede Sourcedatei einzeln erst nur compilieren, indem die Opition -c übergeben wird, und dann alle entstandenen Objektdateien zusammen linken oder gleich alle Sourcedateien mit einem Aufruf compilieren und linke. Also:

    gcc -c main.c
    gcc -c Test.c
    gcc -c Print.c
    gcc main.o Test.o Print.o
    

    Oder mit einem Aufruf:

    gcc main.c Test.c Print.c
    

    Beides erzeugt eine auführbare Datei a.out . Den Namen kannst Du mit der Option -o ändern, also etwa:

    gcc -o myprog main.o Test.o Print.o
    

    Dann entsteht eine ausführbare Datei myprog

    so habe jetzt eine ctest datei und wie öffne ich das im terminal? durch einen doppelklick im ordner hat er eine txt. erstellt (as er ja auch tun sollte), allerdings kommt da keine konsole für die werteeingabe.

    eigentlich müsste er noch nicht kompilieren (ich denke nicht, dass ich alle fehler gefunden habe (denn anscheinend sind nur mehr style-fehler dabei (steht zumindest da wenn ich als flag -pedantic benutze)

    bsy3@bsy3:~/Workspace/Übung2$ gcc main.c Print.c Test.c -Wall -pedantic
    In file included from main.c:9:0:
    Print.h:8:1: warning: C++ style comments are not allowed in ISO C90 [enabled by default]
    Print.h:8:1: warning: (this will be reported only once per input file) [enabled by default]
    main.c: In function ‘main’:
    main.c:13:4: warning: C++ style comments are not allowed in ISO C90 [enabled by default]
    main.c:13:4: warning: (this will be reported only once per input file) [enabled by default]
    In file included from Test.c:9:0:
    Print.h:8:1: warning: C++ style comments are not allowed in ISO C90 [enabled by default]
    Print.h:8:1: warning: (this will be reported only once per input file) [enabled by default]
    Test.c: In function ‘TestFuncPtr’:
    Test.c:238:4: warning: implicit declaration of function ‘PrintStrArr’ [-Wimplicit-function-declaration]

    krieg nur das in der konsole

    kann das jemand auf seinem linux-rechner mal kompilieren?
    http://www.imagenetz.de/fb7135f5d/-bung2.rar.html

    habe was von mingw gelesen, kann man dann den gcc mit emacs oder irgendeinem code-editor verbinden und wenn ja, wie mach ich das?

    mfg
    hawxgamer



  • In C90 gibt es nur /* */ Kommentare,
    die C++ Style // Kommentare gibt es ab C99 mit -std=c99 bringst du gcc in den C99 modus

    Test.c:238:4: warning: implicit declaration of function ‘PrintStrArr
    

    Du hast PrintStrArr nicht deklariert



  • das mit dem PrintStrArr war Absicht von mir, weil ich bei dem Codestück die Parameterliste nicht so ganz verstehe (werde gleich ein Topic für dieses Problem öffnen).

    Diese warning mit dem Kommentar:
    Heißt das, dass der Comiler automatisch zu den anderen C-Standards nachschaut und falls vorhanden, dann einfach weiterkompiliert und nur eine warning ausgibt?
    und kann man das erzeugte Programm auch unter Windows zum laufen bringen?

    mfg
    hawxgamer


Anmelden zum Antworten