Linken nach dem Includen



  • Hallo zusammen,
    Ich arbeite mit Visual C++ 6.0.
    ich habe ein ganz elementares Problem.
    Zum ersten mal will ich include-dateien verwenden, die
    ich aus dem Internet gehohlt habe. Konkret geht es um die GLUT Dateien.
    Auch eine Installationsanleitung habe ich gefunden und befolgt.

    Im wesentlichen habe includedateien in den entsprechenden Ordner kopiert,
    Lib.Dateien in den entsprechenden Ordner kopiert und eine DLL datei im
    besriebenen Verzeichnis gespeichert.

    ALs ich dann ein erstes Programm schreiben wollte, konnte ich das Programm
    Kompilieren, aber nicht linken. Sämtliche Versuche den Linker einzustellen haben dazu geführt, dass andere Programme jetzt auch nicht mehr gelinkt den können.

    Kann mir jemand erklären, was ich da falsch gemacht habe?

    Nebenbei ist mir spetziell bei den lib dateien aufgefallen, dassdiese noch komprimiert sind. Muss ich diese irendwie dekomprimieren?



  • Hmmm vielleicht machst Du angaben zu den Fehlern die der Linker ausspuckt.

    Aber wenn deine libs noch als rar oder zip komprimiert sind würde es sich anbieten mal zu versuchen sie zu entpacken.

    Warum jetzt garnichts mehr läuft??? Vielleicht hast Du die Linker suchpfade verändert. Das ist der -L parameter beim gcc.

    gruß,
    muli



  • folgende meldung spukt der linker aus.

    --------------------Konfiguration: gluttest - Win32 Debug--------------------
    Linker-Vorgang läuft...
    LIBCD.lib(wincrt0.obj) : error LNK2001: Nichtaufgeloestes externes Symbol _WinMain@16
    Debug/gluttest.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
    Fehler beim Ausführen von link.exe.

    gluttest.exe - 2 Fehler, 0 Warnung(en)

    Bemerkung: Sämtliche Linkereinstungen haben wieder standarteinstellungen.
    Muss man den Linker irgendwie einstellen?

    Dabei habe ich folgends testprogramm aus dem Internet verwendet.
    Die Kompilierung verläuft einfandfei.

    #include <GL/glut.h> //GLUT .h-Datei, lädt auch GL .h-Dateien
    void display() //Zeichenfunktion
    {
    glBegin( GL_POLYGON );
    glVertex3f( -0.5, -0.5, -0.5 );
    glVertex3f( 0.5, -0.5, -0.5 );
    glVertex3f( 0.5, 0.5, -0.5 );
    glVertex3f( -0.5, 0.5, -0.5 );
    glEnd();
    glFlush(); //Buffer leeren
    }
    int main(int argc, char **argv)
    {
    glutInit(&argc, argv); // GLUT initialisieren
    glutInitDisplayMode( GLUT_RGB ); // Fenster-Konfiguration
    glutInitWindowSize ( 600,600 );
    glutCreateWindow("1. OpenGL Programm"); // Fenster-Erzeugung
    glutDisplayFunc(display); // Zeichenfunktion bekannt machen
    glutMainLoop();
    return 0;
    }



  • deine int main() ist der Einsprungspunkt für Konsolenanwendungen.

    Du scheinst aber eine Win32-Anwendung zu haben.
    Dort sieht das etwa so aus:

    WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    

    Sowas kann man beim Erstellen seines Projekts auch schon generieren lassen.
    Dann kannst du dir mal anschauen, was da alles dazu gehört. 😉



  • tatsächlich, fürs erste funktiorts.
    Vielen Dank



  • Funktioniert leider noch immer nicht ganz. Diesmal wollte ich mit SDL arbeiten.

    Wieder habe ich keine Problem mit dem Compilieren,aber folgende Fehlermeldung spuckt der Linker jetzt aus:

    --------------------Konfiguration: gluttest - Win32 Debug--------------------
    Linker-Vorgang läuft...
    glutest.obj : error LNK2001: Nichtaufgeloestes externes Symbol _SDL_Quit
    glutest.obj : error LNK2001: Nichtaufgeloestes externes Symbol _SDL_GetError
    glutest.obj : error LNK2001: Nichtaufgeloestes externes Symbol _SDL_Init
    LIBCD.lib(wincrt0.obj) : error LNK2001: Nichtaufgeloestes externes Symbol _WinMain@16
    Debug/gluttest.exe : fatal error LNK1120: 4 unaufgeloeste externe Verweise
    Fehler beim Ausführen von link.exe.

    gluttest.exe - 5 Fehler, 0 Warnung(en)

    Dabei habe ich folgends Programm aus dem Internet verwendet:

    #include <SDL/SDL.h> // SDL-Header
    #include <SDL/SDL_opengl.h> // Bindet plattformabhängig die richtigen Header ein
    #include <iostream> // für Konsolenausgaben

    using std::cout; // Wir verwenden std::cout und
    using std::endl; // std::endl für die Konsolenausgaben

    // Die main Funktion muss unter Windows unbedingt
    // diese Form haben, da es ansonsten zu einem
    // Linkerfehler kommen würde.
    int main(int argc, char **argv)
    {
    if( SDL_Init( SDL_INIT_VIDEO ) != 0 ) // Initialisieren des SDL Video Subsystems
    {
    cout << "Die SDL konnte nicht initalisiert werden (" << SDL_GetError() << ")" << endl;
    return 1;
    }

    cout << "Willkommen zum SDL Testprogramm." << endl;

    SDL_Quit(); // Herunterfahren der SDL Bibliotheken
    return 0;
    }



  • Du musst darauf achten, dass du deinen kompilierten Quelltext auch gegen die entsprechenden Bibliotheken linkst.

    Je nachdem welchen Projekttyp du verwendest fügt die IDE automatisch ein paar Bibliotheken hinzu, gegen die gelinkt wird. Verwendest du Funktionen die sich in anderen Bibliotheken befinden, reicht es nicht nur die Header einzubinden, du müsstest auch gegen die entsprechenden lib Dateien linken, d.h. die Namen der libs unter Projekt/Einsellungen/Linker hinzufügen.

    Wenn dein Quelltext mit dem Einstiegspunkt main() arbeitet ist es günstiger eine Win32-Konsolenanwedung zu erstellen, denn dann sorgt die IDE dafür, dass gegen die nötige Bibliothek gelinkt wird. Du hast vermutlich eine Win32-Anwendung erstellt die als Einstiegspunkt WinMain() voraussetzt.

    Also:
    - arbeite mit dem richtigen Projekttyp
    - füge die nötigen libs unter Projekt/Einstellungen/Linker hinzu

    Falls die SDL - Anleitung/Referenz dir nicht sagt welche Bibliotheken bei der Verwendung einer bestimmten Funktion gelinkt werden müssen, nimmst du halt alle.



  • Hallo hmpf,
    vielen dank für deine Antwort.

    NUn habe ich uner Projekt/einstellungen/Linker/Projekt-optionen
    noch SDLmain.lib und SDL.lib geschrieben. ies sind die beiden Dateien, die ich zuvor in den Ordner LIB kopiert habe.

    Die Fehlermeldung sieht jetzt so aus:

    --------------------Konfiguration: sdltest - Win32 Debug--------------------
    Linker-Vorgang läuft...
    msvcrt.lib(MSVCRT.dll) : error LNK2005: _exit bereits in LIBCD.lib(crt0dat.obj) definiert
    msvcrt.lib(MSVCRT.dll) : error LNK2005: _fclose bereits in LIBCD.lib(fclose.obj) definiert
    msvcrt.lib(MSVCRT.dll) : error LNK2005: __isctype bereits in LIBCD.lib(isctype.obj) definiert
    LIBCD.lib(crt0init.obj) : warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULT:Bibliothek verwenden
    Debug/sdltest.exe : fatal error LNK1169: Ein oder mehrere mehrfach definierte Symbole gefunden
    Fehler beim Ausführen von link.exe.

    sdltest.exe - 4 Fehler, 1 Warnung(en)



  • so, nach intensivem suchen im INternett habe ich in eineanderen Forum gefunden, dass schon einmal jemand dasselbe Problem hatte.
    ICh kenne jetzt die Lösung. Das hat jtzt so viel nerven gekostet, dass ich es auch verstehen möchte. KAnn mir das bitte jemnad erklären.

    Ich schreibe zu beginn des quellcodes:

    #ifdef _WIN32
    #undef main
    #endif

    jetzt klapps.
    Was geschieht da?



  • Mal eine Frage zwischendurch: Hast du in deinem Projekt, wie von den SDL-Jungs verlangt unter Projekt->Einstellungen->C/C++ bei Kategorie "Code Generation" unter "Laufzeit-Bibliothek" die Einstellung "Multithreaded DLL" vorgenommen?

    Wenn ich nämlich deinen Linkfehler bezüglich der LIBCD.lib sehe, dann sieht es so aus, als hättest du das nicht getan.

    Also, bevor du irgendwelche Makros umdefinierst, versuch doch zuerst das.


Anmelden zum Antworten