如何在DLL和exe中使用Glad

问题描述

有没有办法在DLL和exe中使用Glad?我觉得可能有问题,因为DLL具有与exe分开的自己的内存空间,但是我不确定如何重构我的代码来表示这一点。

我的情况是,我有一个游戏引擎,其中包含许多使用OpenGL函数方法,这些方法很容易加载,例如着色器,纹理以及其他与渲染相关的东西。但是,我将引擎导出为dll(出于各种其他原因),并且运行时编辑器链接到该dll。该运行时编辑器还需要访问高兴函数,因为它静态链接到imgui,后者需要相同的窗口上下文和所有内容,并且假设如果我在dll和exe中调用了gladLoadGL(),我将获得不同的函数指针,这意味着它们将不会对相同的数据进行操作。有什么办法吗?我也尝试将GLFW链接为DLL,但这没有帮助(这很有意义,因为这是一个令人高兴的问题)。如果我没有在自己的exe文件中执行gladLoadGL(),则在尝试执行gl函数时会得到nullptr异常(因为在运行时编辑器中只有少数几种情况下使用glFunctions)。但是,如果我确实在exe中运行了GladLoadGL(),它将加载新的函数指针,从而使所有内容丢掉,并且ImGui内部出现错误,我认为这是因为glad已在DLL和exe中加载了不同的函数指针。

这可以做到吗,还是我需要重新考虑整体架构?

编辑:因此,我的原始问题得到了回答,您无需执行任何特殊操作(除了将DLL函数和exe中的函数加载)。但是,这在我的代码中引起了一个新问题,这似乎是实际问题所在。现在,我在DLL中有一个看起来像这样的类:

// In the DLL
class __declspec(dllexport) Application 
{
  Application();

  void Construct(); // I added this because the base constructor would not be called

  virtual void SomeFunc() {} // These are overridden by whoever inherits this class
  virtual void SomeOtherFunc() {}
}

// In the exe
class MyApp : public Application
{
  MyApp() 
  { 
    Construct() // This raises a runtime exception that says the method Could not be found. 
    //Is there any way to make sure I export and import this correctly as well?
  }
}

编辑2 :事实证明,我只是缺少一个构建步骤,并且从未将我的dll复制到该exe所在的位置。再次感谢您的所有帮助

解决方法

重要的是要记住指针变量与其指向的变量之间的区别。如果您在DLL中有一个GLAD实例,而在EXE中有另一个实例,那么对于每个GLAD函数指针,您将有两个指针变量。

但是,它们都指向相同的功能。它们都是在为同一OpenGL上下文加载所有函数指针之后。因此,这些指针将指向相同的功能。

因此,尽管从技术上讲您将浪费一些存储空间(由于DLL和EXE都需要指针变量),但只要加载指针时OpenGL上下文是最新的,它就仍然可以正常工作。