为什么当我包含加载器 header 时我无法使用 OpenGL 函数?
Why am I not able to use OpenGL functions when I include my loader header?
我目前正在尝试创建一个自定义 OpenGL 函数加载器,以便我可以开始设计我自己的自定义游戏引擎。包含所有加载程序代码的 header 格式如下:
#ifndef SWOGLL_H_
#define SWOGLL_H_
#pragma once
#include <Windows.h>
#include <gl/GL.h>
#include <gl/GLU.h>
#include <gl/glext.h>
#include <gl/wglext.h>
static PFNGLACTIVESHADERPROGRAMPROC glActiveShaderProgram;
static PFNGLACTIVETEXTUREPROC glActiveTexture;
// ...
static void* GetGLFunctionPointer(const char* functionName)
{
void* functionPointer = (void*)wglGetProcAddress(functionName);
if(
functionPointer == (void*)0x0 ||
functionPointer == (void*)0x1 ||
functionPointer == (void*)0x2 ||
functionPointer == (void*)0x3 ||
functionPointer == (void*)-0x1
)
{
HMODULE module = LoadLibraryA("opengl32.dll");
functionPointer = (void*)GetProcAddress(module, functionName);
}
return functionPointer;
}
static void GenerateGLFunctionPointers()
{
glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC)GetGLFunctionPointer("glActiveShaderProgram");
glActiveTexture = (PFNGLACTIVETEXTUREPROC)GetGLFunctionPointer("glActiveTexture");
// ...
}
如果我 #include "SWOGLL.h"
在我的 main.cpp
文件中,OpenGL 函数工作正常,假设我在创建 OpenGL 上下文后调用 GenerateGLFunctionPointers()
。
但是,如果我创建一个单独的文件并且 #include "SWOGLL.h"
,OpenGL 函数根本不起作用,即使已经创建了 OpenGL 上下文。
这里有什么问题?
您正在 header 文件中声明 static
函数和变量。除非你有特别好的理由去做如此奇怪的事情,不要那样做。
static PFNGLACTIVESHADERPROGRAMPROC glActiveShaderProgram;
static void* GetGLFunctionPointer(const char* functionName)
这将创建 glActiveShaderProgram
、GetGLFunctionPointer()
的 不同 副本,以及在包含header.
删除 static
,然后执行以下操作之一:
保留 header 中的声明,但将定义移至 C++ 文件。
保留header中的声明和定义,但将其标记为inline
。这不适用于全局变量。
static
关键字,在这种情况下,使得声明 static
的函数和变量具有 "internal linkage",这意味着您为每个 C++ 获得它们的单独副本定义它们的文件。这不同于声明一个成员函数 static
,它具有完全不相关的效果。不幸的是关键字 static
在不同的地方有不同的含义。 C'est la vie.
我目前正在尝试创建一个自定义 OpenGL 函数加载器,以便我可以开始设计我自己的自定义游戏引擎。包含所有加载程序代码的 header 格式如下:
#ifndef SWOGLL_H_
#define SWOGLL_H_
#pragma once
#include <Windows.h>
#include <gl/GL.h>
#include <gl/GLU.h>
#include <gl/glext.h>
#include <gl/wglext.h>
static PFNGLACTIVESHADERPROGRAMPROC glActiveShaderProgram;
static PFNGLACTIVETEXTUREPROC glActiveTexture;
// ...
static void* GetGLFunctionPointer(const char* functionName)
{
void* functionPointer = (void*)wglGetProcAddress(functionName);
if(
functionPointer == (void*)0x0 ||
functionPointer == (void*)0x1 ||
functionPointer == (void*)0x2 ||
functionPointer == (void*)0x3 ||
functionPointer == (void*)-0x1
)
{
HMODULE module = LoadLibraryA("opengl32.dll");
functionPointer = (void*)GetProcAddress(module, functionName);
}
return functionPointer;
}
static void GenerateGLFunctionPointers()
{
glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC)GetGLFunctionPointer("glActiveShaderProgram");
glActiveTexture = (PFNGLACTIVETEXTUREPROC)GetGLFunctionPointer("glActiveTexture");
// ...
}
如果我 #include "SWOGLL.h"
在我的 main.cpp
文件中,OpenGL 函数工作正常,假设我在创建 OpenGL 上下文后调用 GenerateGLFunctionPointers()
。
但是,如果我创建一个单独的文件并且 #include "SWOGLL.h"
,OpenGL 函数根本不起作用,即使已经创建了 OpenGL 上下文。
这里有什么问题?
您正在 header 文件中声明 static
函数和变量。除非你有特别好的理由去做如此奇怪的事情,不要那样做。
static PFNGLACTIVESHADERPROGRAMPROC glActiveShaderProgram;
static void* GetGLFunctionPointer(const char* functionName)
这将创建 glActiveShaderProgram
、GetGLFunctionPointer()
的 不同 副本,以及在包含header.
删除 static
,然后执行以下操作之一:
保留 header 中的声明,但将定义移至 C++ 文件。
保留header中的声明和定义,但将其标记为
inline
。这不适用于全局变量。
static
关键字,在这种情况下,使得声明 static
的函数和变量具有 "internal linkage",这意味着您为每个 C++ 获得它们的单独副本定义它们的文件。这不同于声明一个成员函数 static
,它具有完全不相关的效果。不幸的是关键字 static
在不同的地方有不同的含义。 C'est la vie.