undefined reference to ...



  • Ich versuche z.Zt. ein Klassendefinition (.cpp) zu kompilieren und erhalte folgende Fehlermeldung.

    C:\PROGRA1\DEV-C_1\Lib\\libmingw32.a(main.o)(.text+0x8e): undefined reference to `WinMain@16'

    Weitere Fehlermeldungen erhalte ich nicht. Ich verwende die IDE von dev-c++ von Bloodshed und habe sowohl den mingw als auch den cygwin Compiler ausprobiert und erhalte trotzdem die selbe Fehlermeldung.
    Dies ist der Inhalt des Compiler Logs (...==gekürzt):
    C:\PROGRA1\DEV-C_1\Bin\g++ c:\...~1.cpp -o c:\...~1.exe -s -IC:\PROGRA1\DEV-C_1\Include\ -IC:\PROGRA1\DEV-C_1\Include\G__~1 -IC:\PROGRA1\DEV-C_1\Include\ -IC:\...\MY_INC~1 -LC:\PROGRA1\DEV-C_1\Lib\ -BC:\PROGRA1\DEV-C_1\Bin\

    Danke im voraus !

    /edit
    Ich habe noch ein kleines Testprogramm geschrieben und zu kompilieren versucht, erhalte aber die gleiche Fehlermeldung. Die header-Files sind korrekt eingebunden.
    Es fällt mir auf, daß der compiler eine .exe z generieren versucht. Ist das in Ordnung ? Wenn nicht wie gewöhne ich ihm das ab ?

    [ Dieser Beitrag wurde am 21.05.2002 um 13:31 Uhr von c++==d editiert. ]



  • hmm.. sieht ganz danach aus, dass du eine Windowsdatei erstellen willst, aber ein DOS-Konsolen-Programm kompilierst.

    schalte mal in den project options (oder compiler options) die checkbox "don't create console"
    aus! Dann sollte es eigentlich funktionieren

    cYa
    DjR



  • Danke, hat sich erledigt.
    Ich habe die .h und .cpp in ein Projekt gepackt und der Compiler frißt das ganze ohne zu murren.



  • Hmm, anscheinend hat es sich doch noch nicht erledigt. Nun erhalte ich die Fehlermeldung auch in einem anderen Projekt. Der Code sieht so aus:

    // Kapitel 11 - Programm 1 - PERSON.H
    #ifndef PERSON_H
    #define PERSON_H
    
    class Person
    {
    protected:  // Diese Variablen sind in Subklassen verfügbar
       char Name[25];
       int Gehalt;
    public:
       virtual void Zeige(void);
    };
    
    #endif
    
    // Kapitel 11 - Programm 2 - PERSON.CPP
    #include <iostream.h>
    #include "person.h"
    
    // Diese Methode sollte nie aufgerufen werden. Sollte
    // dies passiert, betrachten wir das als Fehler.
    void
    Person::Zeige(void)
    {
       cout << "Person::Zeige - fehlende Methode in der Subklasse\n";
    }
    

    Ist ein Bsp.Prog aus ´nem Tut. Wie bereits erwähnt verwende ich den dev-c++ ide. Der Fehler tritt sowohl bei beiden Compilern auf. Unter dev-c++ compiliert per default für Konsole, sprich Compile for Win32(no concole) ist nicht gecheckt.

    [edit]
    Ich würde nicht nur gerne wissen, wie man daß Problem umgeht/behebt, sondern auch woher es kommt bzw. was die Fehlermeldung zu bedeuten hat. Falls Ihr eine Erklärung/These/Idee o.ä. habt, postet bitte auch diese !
    Danke
    [/edit]

    [ Dieser Beitrag wurde am 27.05.2002 um 09:51 Uhr von c++==d editiert. ]



  • DocJunior hat da schon ganz recht:

    C:\PROGRA1\DEV-C_1\Lib\\libmingw32.a(main.o)(.text+0x8e): undefined reference to `WinMain@16'

    ... ist ein Linker-Fehler. Er besagt 'eigentlich', das der Linker den Einsprungpunkt eines Windowsprogramms (eben die WinMain-Funktion) nicht findet. Weder in einer .lib-datei (selten) noch in einem (.cpp-)File deines Projekts. Wenn du aber eine .exe (also ein "echtes" Programm) erstellen willst, brauchst du zwingend einen Einsprungpunkt, eine (Win-)main-Funktion.

    Das dein Code nicht falsch ist, erkennst du daran, das der Fehler beim Linken und nicht beim Compilieren auftritt. Denn erst der Linker verbindet (linkt) die einzelnen zu Objectcode kompilierten Teile zu einem Programm.

    Wenn du einzelne Klassen (vor-)kompilieren willst, dann geht das eben nicht in einem Programm, sondern nur über Auswege. Library-Dateien (.lib) sind eine Möglichkeit, die du in einzelne Projekte einbindest und so die Klassen bereitstellst.
    Unter Windows gibt es noch die Möglichkiet der .dll-Dateien. Dabei werden die Klassen erst zur Laufzeit des Programms zum Programm gelinkt (eben Dynamic Linked Library).

    Das Ganze sind dann einzelne Projekttypen in deiner IDE.

    Ich hoffe, das war ausführlich genug. 😉



  • @Garret
    Danke für die ausführliche Antwort. Ich werde wohl noch ein wenig Zeit benötigen, bis ich sie vollständig verdaut habe.
    Obwohl, es sollte doch möglich sein einzelne Projektteile in eine Objektdatei zukompilieren und diese zu einem späteren Zeitpunkt zu linken also erst nur den Compiler aufzurufen und später dann den Linker. Die Einstellungen dafür sind vermutlich IDE-spezifisch. Ich werde dann mal suchen.

    Nochmals Danke an alle !



  • win32:LIBS += -lqtmain
    könnte helfen



  • Domsen schrieb:

    win32:LIBS += -lqtmain
    könnte helfen

    Also, wenn man eine Consolen APP für windows macht, bietet die libqtmain wohl die nötige winmain (und leitet auf deine normale main weiter)

    Damit kann man CONFIG += console in das QT projekt file eintragen und sieht demnach auch den output auf der Konsole in Windows

    d.h.:

    win32:CONFIG += console
    win32:LIBS += -lqtmain
    

    müsste funktionieren, um das erste Problem hier zu lösen
    undefined reference to "__Winmain@16" o.ä.
    (falls jemand ähnliche Probleme hat, wie ich)



  • mir ist aufgefallen, in deinem code ist ja gar keine main-funktion. Ich hatte das gleiche Problem nämlich auch (hatte auch keine main-fkt); jezt hab ich ne main-fkt reingebaut und es funnktioniert 🙂


Anmelden zum Antworten