openGL/Glut undefined reference?



  • ich hab hier etwas was ich nicht so ganz verstehe. und zwar habe ich mir einen sourcecode von der NeHe seite gezogen (OpenGL Basecode -> NeHeGL GLut). will nähmlich OpenGL ohne die WinAPI lernen.
    Nun versteh ich eines nicht - wenn ich den code einfach builden will, bekomme ich jede menge undefined reference fehler beim linken, z.B:

    D:/Projects/NEHEGL/nehegl_glut.cpp:117: undefined reference to `__imp__glIsEnabled'
    D:/Projects/NEHEGL/nehegl_glut.cpp:118: undefined reference to `__imp__glDisable'
    D:/Projects/NEHEGL/nehegl_glut.cpp:120: undefined reference to `__imp__glGetIntegerv'
    

    include ich einfach irgendwo die windows.h, dann reduziert sich die anzahl der fehler. Der code, der bei CodeBlocks erzeugt wird, wnmen man ein GLut-Projekt startet klappt nach dem includen von windows.h sogar komplett 😕
    Die bei NeHe-code übrig gebliebenen fehler:

    obj\Debug\tga.o: In function `_Z13CreateTexturePjPci':
    D:/Projects/NEHEGL/tga.cpp:284: undefined reference to `__imp__glGenTextures'
    D:/Projects/NEHEGL/tga.cpp:300: undefined reference to `__imp__gluBuild2DMipmaps'
    D:/Projects/NEHEGL/tga.cpp:310: undefined reference to `__imp__glTexParameteri'
    D:/Projects/NEHEGL/tga.cpp:311: undefined reference to `__imp__glTexParameteri'
    

    Ich nutze als
    IDE: CodeBlocks 8.02
    Compiler: MinGW GCC, hab versionen 3.4.5, 4.2.3, 4.3.0 probiert

    gelinkt wird: glut32, opengl32, glu32

    glut-version: 3.7.6+

    Ist es unter WIndows notwendig, bei openGL anwendungen die windows.h einzubinden?

    Edit: Hab mal den tga loader aus dem code entfernt. kriegt der würfel halt keine textur. jetzt klappts wenn man windows.h includet. Jedoch würde ich gerne wissen ob das zwingend notwendig ist 😕


  • Mod

    du hast einen linkerfehler, wenn alle libs richtig eingebunden sind, sollte das gehen. oft kann dir die suche hier im forum schneller antworten liefern

    so fand ich z.B.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-81471



  • Erweitere mal Deine Projektkonfiguration:

    Includes:

    #include <gl\gl.h>
    #include <gl\glu.h>
    

    Libs:

    opengl32.lib 
    glu32.lib
    


  • oben hab ich die libs genannt die ich mitlinke, die opengl32 und glu32 sind mit drin, und in der glut.h finden sich folgende zeilen:

    #include <GL/gl.h>
    #include <GL/glu.h>
    

    Ich glaub es muss wohl so sein, dass man die windows.h braucht, hab mit mal die glut.h genauer angeschaut und das gefunden:

    #if defined(_WIN32)
    ...
    ...
    ...
    #include <windows.h>
    ...
    ...
    ...
    #endif
    

    hab einfach ma _WIN32 in _WIN32_ umbenannt jetzt wirds ja eingebunden :/. so gehts. seltsam. kann mir nicht vorstellen wieso GLut die WInAPI braucht :|



  • Liegt wohl daran, weil GLUT dir ein Fenster erstellt. Und unter Windows macht es das mit der WinAPI -> #include <windows.h>
    😃



  • Die Erwähnung der Libs habe ich zwar gesehen, aber nicht die Includes und ohne den halbwegs kompletten Source kann man nur raten 🤡

    Soweit ich weiss, erlaubt die Abfrage nach WIN32 die Plattform-Unabhängigkeit.
    Im GLUT Source glut_win.c findest Du z.B. dies hier:

    CreateWindow("GLUT", "GLUT",
    WS_CLIPSIBLINGS | WS_CLIPCHILDREN | style,
    x, y, width, height, parent ? parent->win : __glutRoot,
    NULL, GetModuleHandle(NULL), 0);

    glut.h selbst deklariert u.a. folgendes:
    GLUTAPI void APIENTRY glutInitWindowPosition(int x, int y);

    Damit erklärt sich wohl auch die Notwendigkeit nach den Windows Headern.



  • Aso....

    Okay ich glaub es ist der Augenblick gekommen wo es angebracht ist mit dem Kopf gegen die Wand zu rennen xDDD.

    Danke auf jeden Fall 😃


Log in to reply