Globaler unmanaged Funktionszeiger



  • Hi,

    ich möchte in einem mixed Projekt einige OpenGL-Erweiterungen nutzen. Die Funktionszeiger sind ja bereits in glext.h definiert.

    glext.h

    ...
    typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers);
    ...
    

    Die Adressen der Funktionen muss man noch mit wglGetProcAddress(...) holen. Dafür habe ich eine Datei GLExtensionLoader.h angelegt.

    GLExtensionLoader.h

    #pragma once
    
    #include "windows.h"
    #include <gl\gl.h>
    #include <gl\glext.h>
    
    PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT = NULL;
    
    public ref class GLExtensionLoader
    {
    public:
        static void LoadExtension(char *extension);
    };
    

    GLExtensionLoader.cpp

    void GLExtensionLoader::LoadExtension(char *extension)
    {
      if (extension == "GL_EXT_framebuffer_object")
      {
         glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)wglGetProcAddress("glGenFramebuffersEXT");
      }
    

    Nach einem Aufruf von LoadExtension("GL_EXT_framebuffer_object") habe ich dann auch den Funktionszeiger und kann glGenFramebuffersEXT(GLsizei n, GLuint *framebuffers) aufrufen.

    Wenn ich dann aber in einer anderen Datei (GLExtensionUser.cpp) ein #include "GLExtensionLoader.h" mache, gibts folgenden Linker-Fehler:

    GLExtensionLoader.obj : error LNK2005: "void (__stdcall* glGenFramebuffersEXT)(int,unsigned int *)" (?glGenFramebuffersEXT@@3P6GXHPAI@ZA) already defined in GLExtensionUser.obj

    Ich vermute dass es an dem globalen Funktionszeiger liegt. Wie kann man sowas richtig implementieren?

    Gruss,
    Ligh7ning



  • Das initialisieren von

    PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT = NULL;
    

    darfst Du nicht in der h-Datei machen sondern musst es so machen:
    h-Datei:

    extern PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
    

    In *einer* c/cpp-Datei:

    PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT = NULL;
    


  • Super, danke Dir!


Anmelden zum Antworten