GL-Extension Funktionen werden nicht gefunden
-
Ich arbeite gerade an einem GL-Projekt mit Eclipse und CDT3.0. Als Compiler kommt der GCC zum einsatz.
Alles lief gut, bis ich Multitexturing einbauen wollte. Der Compiler sagt, er kenne die Funktion glActiveTexture und glMultiTexCoord nicht.
Ich habe den glext.h eingebunden. Dieser enthält ja (zumindest unter Windows) diese Funktionen.
Wenn ich per Ctrl+Click auf einen der beiden Namen klicke, meldet mir Eclipse, dass es die Funktionen nicht finden könne. Wenn ich z.B. eine der Konstanten (GL_TEXTURE1) anklicke, komme ich in dem Header raus, welcher auch die Funktionen beinhaltet.Ich vermutete nun folgendes:
Der Compilerschalter GL_GLEXT_PROTOTYPES schien das zu verhindern. Den hab ich jetzt aber programmseitig auf true gesetzt. Trotzdem keine Änderung.Ich komm hier nicht weiter. Ich kenn mich auch mit dem gcc nicht so übermäßig aus, um nachzuvollziehen, wieso er Funktionen aus der glext.h nicht einbindet, die Constanten aber schon. Wenn ihr mir da helfen könntet wäre das super, es ist nämlich verhältnismäßig wichtig, das ich das zum laufen bekomme.
PS: Kurzer ausschnitt aus meiner glext.h
... /* Header file version number, required by OpenGL ABI for Linux */ /* glext.h last updated 2005/06/20 */ /* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */ #define GL_GLEXT_VERSION 29 ... #ifndef GL_VERSION_1_3 #define GL_VERSION_1_3 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glActiveTexture (GLenum); ...
-
Habt ihr wirklich keine Idee? Ich hab auch nochmal in nem GL-Forum gepostet, aber bis jetzt gabs auch von dort noch keine Lösung.
Bisherige Antworten: http://www.delphigl.com/forum/viewtopic.php?p=42540
-
Sowas ähnliches hatte ich auch schon, das Problem war wirklich auch dieser GLX_GLXEXT_PROTOTYPES, den ich erst definen musste.
Wenn der blabla_PROTOTYPES defined ist UND Du ne aktuelle OpenGL-Version hast (>=1.3), dann findet er die Funktion auch bestimmt. --> Ich kenn mich mit Windows nicht so aus, aber IMHO ist hier das Problem: Windows ist nach wie vor bei OpenGL 1.1.
Du musst deshalb Extensions etwas anders einbinden als bei den richtigen BS. Guckst Du z.B. hier: http://support.microsoft.com/default.aspx?scid=kb;en-us;328303
-
Der MS Header ist nur ein Fallback. Jeder PC auf dem schonmal Spiele gespielt wurden hat in der Regel eine neuere OpenGL.dll und somit auch OpenGL-Version.
Mein Laptop mit OnBoardchip hat z.B. dieses OpenGL-Rüstzeug:
VENDOR: Intel RENDERER: Intel Brookdale-G VERSION: 1.3.0 - Build 4.14.10.3691Somit greife ich auf eine Corefunktion zu, die bei mir unterstützt werden sollte.
Das Problem hat sich jetzt etwas geändert. Der Compiler geht jetzt butterweich durch, nur der Linker macht noch Probleme:
Building target: Puke_Machine.exe Invoking: GCC C++ Linker g++ -LC:\Programmieren\Imported_Libs\SDL_Libs -LC:\Programmieren\EclipseProjects\GL_SDL_UI\Debug -LC:\Programmieren\EclipseProjects\GL_SDL_TEX\Debug -LC:\Programmieren\EclipseProjects\Utils\Debug -oPuke_Machine.exe ./src/Application.o ./src/Kamera.o ./src/Karusell.o ./src/createUI.o ./src/main.o -lGL_SDL_UI -lGL_SDL_TEX -lUtils -lSDL -lSDLmain -lSDL_image -lSDL_ttf -lOpenGL32 -lGLU32 ./src/Karusell.o(.text+0xca2): In function `ZN8Karusell9drawBasisEv': C:/Programmieren/EclipseProjects/Puke_Machine/Debug/../src/Karusell.cpp:184: undefined reference to `glActiveTexture@4' ./src/Karusell.o(.text+0xdad):C:/Programmieren/EclipseProjects/Puke_Machine/Debug/../src/Karusell.cpp:189: undefined reference to `glActiveTexture@4' ./src/Karusell.o(.text+0xf19):C:/Programmieren/EclipseProjects/Puke_Machine/Debug/../src/Karusell.cpp:197: undefined reference to `glMultiTexCoord2i@12' ./src/Karusell.o(.text+0xf38):C:/Programmieren/EclipseProjects/Puke_Machine/Debug/../src/Karusell.cpp:198: undefined reference to `glMultiTexCoord2i@12' ./src/Karusell.o(.text+0xf79):C:/Programmieren/EclipseProjects/Puke_Machine/Debug/../src/Karusell.cpp:200: undefined reference to `glMultiTexCoord2i@12' ./src/Karusell.o(.text+0xf98):C:/Programmieren/EclipseProjects/Puke_Machine/Debug/../src/Karusell.cpp:201: undefined reference to `glMultiTexCoord2i@12' ./src/Karusell.o(.text+0xfd9):C:/Programmieren/EclipseProjects/Puke_Machine/Debug/../src/Karusell.cpp:203: undefined reference to `glMultiTexCoord2i@12' ./src/Karusell.o(.text+0xff8):C:/Programmieren/EclipseProjects/Puke_Machine/Debug/../src/Karusell.cpp:204: more undefined references to `glMultiTexCoord2i@12' follow ./src/Karusell.o(.text+0x10a3): In function `ZN8Karusell9drawBasisEv': C:/Programmieren/EclipseProjects/Puke_Machine/Debug/../src/Karusell.cpp:213: undefined reference to `glActiveTexture@4' ./src/Karusell.o(.text+0x10c1):C:/Programmieren/EclipseProjects/Puke_Machine/Debug/../src/Karusell.cpp:216: undefined reference to `glActiveTexture@4' collect2: ld returned 1 exit status make: *** [Puke_Machine.exe] Error 1 make: Target `all' not remade because of errors. Build complete for project Puke_Machine
-
KFlash schrieb:
Der MS Header ist nur ein Fallback. Jeder PC auf dem schonmal Spiele gespielt wurden hat in der Regel eine neuere OpenGL.dll und somit auch OpenGL-Version.
Mein Laptop mit OnBoardchip hat z.B. dieses OpenGL-Rüstzeug:
VENDOR: Intel RENDERER: Intel Brookdale-G VERSION: 1.3.0 - Build 4.14.10.3691Somit greife ich auf eine Corefunktion zu, die bei mir unterstützt werden sollte.
Das Problem hat sich jetzt etwas geändert. Der Compiler geht jetzt butterweich durch, nur der Linker macht noch Probleme:
Yep klar, der Grafikkartentreiber installiert Dir natürlich schon aktuelle OpenGL-Unterstützung (Wobei, 1.3 ist ja auch saualt. Ist das normal? Bei Linux ist schon lange 2.0...).
Trotzdem, wer definiert GL_VERSION_1_3 ? Windows jedenfalls nicht...
Du kannst nicht einfach nen Header einbinden und die defines entsprechend setzen, dann geht das Linken natürlich nicht..
-> Guck Dir den Link an, den ich angegeben hab, da wirst Du geholfen.
-
Geht das auch irgendwie leichter. Als Delphi-Programmierer bin ich den Komfort einer DGLOpenGL.pas gewöhnt. Da macht es für mich keinen unterschied ob ich GL1.0 oder GL2.0 Funktionen verwende, da der Header alles verwaltet.
-
Ja das ist ja die leichte Version
Musst ja bloss diese Windows-Funktion anwenden, dann ist die Version egal.
Nur- neuen GraKa-Treiber installieren
- komische Windows-Funktion anwenden
- et voila...
Wenn Du es noch einfacher willst: Linux installieren

-
durito schrieb:
Yep klar, der Grafikkartentreiber installiert Dir natürlich schon aktuelle OpenGL-Unterstützung (Wobei, 1.3 ist ja auch saualt. Ist das normal? Bei Linux ist schon lange 2.0...).
Trotzdem, wer definiert GL_VERSION_1_3 ? Windows jedenfalls nicht...
Du kannst nicht einfach nen Header einbinden und die defines entsprechend setzen, dann geht das Linken natürlich nicht..
-> Guck Dir den Link an, den ich angegeben hab, da wirst Du geholfen.1.3.0 weil nur ein Laptop. Der unterstützt numnal net mehr.

Wer GL_VERSION_1_3 definiert? Na der Header:
#ifndef GL_VERSION_1_3 #define GL_VERSION_1_3 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glActiveTexture (GLenum);Aber das binden wird wohl wahrscheinlich trotzdem nötig sein... Obs mir gefällt oder net.
-
KFlash schrieb:
Das Problem hat sich jetzt etwas geändert. Der Compiler geht jetzt butterweich durch, nur der Linker macht noch Probleme:
Vielleicht erklärst Du auch kurz, wie Du es geschafft hast...

-
Ich hab das entsprechende Kompilerflag gesetzt, und zwar direkt hart im Header. Dadurch hat er zumindest die Definitionen gefunden...
-
KFlash schrieb:
1.3.0 weil nur ein Laptop. Der unterstützt numnal net mehr.

Das hat damit nix zu tun. Das liegt an einem bescheidenen Treiber...
-
Ok ich bin jetzt zum manuellen aktivieren übergegangen.
In der cpp wo ich Multitexturing benötige habe ich folgendes gemacht
#include <GL/glext.h> #include <windows.h> PFNGLACTIVETEXTUREARBPROC glActiveTextureARB = NULL; PFNGLMULTITEXCOORD2IARBPROC glMultiTexCoord2iARB = NULL; Karusell::Karusell() { //initialisiere Multitexturing glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2iARBPROC) wglGetProcAddress("glMultiTexCoord2iARB"); glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) wglGetProcAddress("glActiveTextureARB") ... } void Karusell::draw() { ... glActiveTextureARB(GL_TEXTURE1);Beim aufruf von glActiveTextureARB bekomme ich einen Segmentation fault. Und zwar weil die Funktionen angeblich noch NULL sind. Wieso? An der Initialisierung kanns ja nun nicht mehr liegen oder?
-
Heieiei, tu doch mal meinen Link lesen (2. posting...)
To access an extension function that is not part of the standard OpenGL library, call the wglGetProcAddress function. If the extension function exists in the current implementation, then wglGetProcAddress gives you a function pointer, which you can use to access the function. Otherwise, wglGetProcAddress returns NULL
-
Du solltest schon Fehler abfangen, nicht einfach sinnlos im Speicher rumgreifen/schreiben/lesen...

-
Es muss doch aber vorhanden sein, weil meine GL-Implementation 1.3 ist. Da sind die Multitexturingfunktionen im Kern enthalten.
-
Hatte noch keinen GL-Kontext. Habe die Funktionen zu früh gebunden, da war noch der MS-SW-Renderer am start. Jetzt gehts. Danke.
-
KFlash schrieb:
Es muss doch aber vorhanden sein, weil meine GL-Implementation 1.3 ist. Da sind die Multitexturingfunktionen im Kern enthalten.
Ob eine Extension vorhanden ist oder nicht haengt nicht von der ogl-Version ab, sondern einzig von Deinem GraKa-Treiber. Du kannst auch OpenGL 2.0 haben, und doch nur sehr wenige unterstuetzte Extensions...
Darum sinds ja Extensions...
-
durito schrieb:
KFlash schrieb:
Es muss doch aber vorhanden sein, weil meine GL-Implementation 1.3 ist. Da sind die Multitexturingfunktionen im Kern enthalten.
Ob eine Extension vorhanden ist oder nicht haengt nicht von der ogl-Version ab, sondern einzig von Deinem GraKa-Treiber. Du kannst auch OpenGL 2.0 haben, und doch nur sehr wenige unterstuetzte Extensions...
Darum sinds ja Extensions...
Aber die Versionen spezifizieren ja eben ein paar feste "Extensions", sonst wär' das ja Quatsch, dann wär' OpenGL nie über 1.0 heraus...

-
Ja schon klar. Aber wenns die Extensions nicht gäb, dann gäbs heute OpenGL 2718.0
