1

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

我的情况是我有一个游戏引擎,其中包含许多使用由glad 加载的OpenGL 函数的方法,例如着色器、纹理和其他与渲染相关的内容。但是,我将引擎导出为 dll(出于各种其他原因),并且运行时编辑器链接到该 dll。这个运行时编辑器也需要访问glad函数,因为它静态链接到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 所在的位置。再次感谢所有的帮助

4

1 回答 1

2

记住指针变量和它所指向的内容之间的区别很重要。如果在 DLL 中有一个 GLAD 实例,在 EXE 中有另一个,那么对于每个 GLAD 函数指针,您将有两个指针变量。

但是,它们都指向同一个函数。它们毕竟是为同一个 OpenGL 上下文加载函数指针。所以这些指针将指向相同的函数。

因此,虽然您在技术上会浪费一些存储空间(因为 DLL 和 EXE 都需要指针变量),但只要加载指针时 OpenGL 上下文是当前的,它应该仍然可以正常工作。

于 2020-08-28T04:35:40.563 回答