如何将 <glad/glad.h> 包含在 C++ 中的多个头文件中?

Posted

技术标签:

【中文标题】如何将 <glad/glad.h> 包含在 C++ 中的多个头文件中?【英文标题】:How to include <glad/glad.h> into several header files in C++? 【发布时间】:2021-01-25 18:08:28 【问题描述】:

我有一个使用 opengl 的 C++ 项目。我有 main.cpp 使用 openGL 初始化,创建窗口和类似的东西。 我想创建一个类,我可以在其中将一些纹理外包到着色器中。 但是当我尝试使用 shader.h 或glad.h 头文件作为包含在任何其他类头文件中时,我得到了错误:

致命错误 C1189:#error: OpenGL 标头已包含,请移除 这包括,很高兴已经提供了它

如果我在 main.cpp 中执行所有逻辑,一切都很好,只有在除 main.cpp 之外的任何地方尝试使用 openGL 函数时才会出现问题

main.cpp:

#include <glad/glad.h> // generated from https://glad.dav1d.de
#include "shader.h"

int main()

     ... //Do OpenGL Staff

shader.h:

#ifndef SHADER_H
#define SHADER_H

#include <glad/glad.h>
#include <glm/glm.hpp>


class Shader

public:
    unsigned int ID;
...//some Shader definition staff

#endif

现在我希望外部类“Maze.h”在 opengl 纹理中加载它的地图,类似于这样:

class Maze

public:
    ...//some maze-relate staff
    void LoadMazeToGL(Shader* shader)
   
        // load and create a texture 
        // -------------------------
        glGenTextures(1, &screenTex1);
        glBindTexture(GL_TEXTURE_1D, screenTex1);
        // set the texture wrapping parameters
        glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);   // set texture wrapping to GL_REPEAT (default wrapping method)
        glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        // set texture filtering parameters
        glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

        GLint curMapId = glGetUniformLocation(shader->ID, "shaderInternalVarName");
        glUniform1i(curMapId, 2); // Texture unit 2 is for current map.

        ... //define and fill tex1data using Maze private information
    
        glActiveTexture(GL_TEXTURE0 + 2);
        glBindTexture(GL_TEXTURE_1D, screenTex1);
        glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, MazeIntegerSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex1data);
    
    

【问题讨论】:

删除您的第一个glad.h 包含。你知道如何在 c/c++ 中使用 #ifndef #define 吗?这是避免问题的标准方法。 【参考方案1】:

要检查此类问题,请使用 GCC/g++ 的 -E 标志或编译器的替代选项。这会输出预处理器的结果(因此包含等)。然后,您可以查看生成的文件并查找双重包含。您可能只是在某处忘记了包含保护:)

【讨论】:

不起作用。还有别的东西。一些我不认识的预处理器技巧。这是我正在尝试解决的类似问题的代码的存储库github.com/IronLynx/maze4d

以上是关于如何将 <glad/glad.h> 包含在 C++ 中的多个头文件中?的主要内容,如果未能解决你的问题,请参考以下文章

包含glad.h时的分段错误

使用glew和glad 新建窗口

Base Env

texture

GL_UI

OpenGL 第一个三角形!!!!