当我包含我的加载程序头时,为什么我无法使用OpenGL函数?

时间:2016-09-19 16:49:14

标签: c++ opengl function-pointers c++14

我目前正在尝试创建一个自定义OpenGL函数加载器,以便我可以开始设计自己的自定义游戏引擎。包含所有加载程序代码的标头格式如下:

#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上下文。

这里有什么问题?

1 个答案:

答案 0 :(得分:4)

您在头文件中声明了static个函数和变量。除非你有一个非常好的理由做一些如此奇怪的事情,不要这样做

static PFNGLACTIVESHADERPROGRAMPROC glActiveShaderProgram;

static void* GetGLFunctionPointer(const char* functionName)

这将在包含标头的每个C ++文件中创建glActiveShaderProgramGetGLFunctionPointer()不同副本以及其他所有声明为static的副本。

删除static,然后执行以下操作之一:

  1. 将声明保留在标题中,但将定义移动到C ++文件。

  2. 在标题中保留声明和定义,但标记为inline。这不适用于全局变量。

  3. 在这种情况下,static关键字使得声明static的函数和变量具有“内部链接”,这意味着您为每个定义的C ++文件获取它们的单独副本他们。这与声明成员函数static不同,后者具有完全不相关的效果。有点不幸的是,关键字static在不同的地方意味着不同的东西。 C'est la vie。