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!