在没有加载库的情况下加载 opengl 函数时出错

Posted

技术标签:

【中文标题】在没有加载库的情况下加载 opengl 函数时出错【英文标题】:Error while loading opengl functions without a loading library 【发布时间】:2019-01-23 13:22:27 【问题描述】:

我真的不知道我做错了什么。我没有使用加载库,所以我可以更好地控制我的代码。我用的是windows操作系统。

#include <gl/GL.h>
#include <windows.h>

typedef BOOL(WINAPI wglSwapInterval_t) (int interval);
static wglSwapInterval_t* wglSwapInterval;

#ifndef GLAPI
#define GLAPI extern
#endif

#ifndef APIENTRYP
#define APIENTRYP APIENTRY *
#endif

#define GL_VERTEX_SHADER 0x8B31
#define GL_FRAGMENT_SHADER 0x8B30

typedef GLuint(APIENTRYP PFNGLCREATEPROGRAMPROC) (void);
PFNGLCREATEPROGRAMPROC glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");

错误:

(5): error C2086: 'wglSwapInterval_t (__stdcall *__stdcall wglSwapInterval)': redefinition
(5): note: see declaration of 'wglSwapInterval'
(19): error C2374: 'glCreateProgram': redefinition; multiple initialization
(19): note: see declaration of 'glCreateProgram'

【问题讨论】:

您遇到了哪个错误?什么不工作?你有一个有效的 OpenGL 上下文吗? 对不起,我在编辑中发布了错误 @BobTheTreeGod 见wglext - extension not installed in OpenGL context 我敢打赌,你要么自己做多个包含(简单的#ifndef xxx #define xxx ... #endif 会修复它),要么重新定义已经包含的东西,比如wglSwapInterval_t 现在似乎可以与 ifndef 一起使用 @BobTheTreeGod 是的,所以你不止一次包含该文件......我还在某些平台(AVR32/GCC)上看到编译器编译目录中的所有 C 或 Cpp 文件,所以如果你包含C 或 Cpp 文件在其编译两次 ...在多个包含/编译时,它只会为每个单独的对象编译一次 ... 【参考方案1】:

错误C2086 表示您已多次定义wglSwapInterval

错误C2374 表示您已多次定义和初始化glCreateProgram

此类问题的常见原因是在一个 .cpp 文件中直接或间接地多次包含不受保护的 .h 文件(即包含在另一个文件中,而该文件本身包含在当前文件中)。

为避免此类问题,请始终将 #ifndef#pragma once 作为 include guard 放入您的 .h 文件中。

【讨论】:

以上是关于在没有加载库的情况下加载 opengl 函数时出错的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL中不用AUX库来加载BMP图片作为纹理

尝试在 AIX 中动态加载 Oracle 客户端库时出错

在为 Drupal 应用程序加载 50 个用户的情况下运行 jmeter 测试一段时间时出错

图像加载导致 OpenGL 中的处理缓慢

在所有代码都正确的情况下,OpenGL加载不了纹理的原因之一(不易发现)

OpenGL - 纹理加载不正确