如何在DLL和exe中使用Glad
How to use Glad in DLL and exe
有什么方法可以在 DLL 和 exe 中使用 Glad?我觉得可能存在问题,因为 DLL 有自己的内存 space,与 exe 分开,但我不确定我将如何重构我的代码来表示它。
我的情况是,我有一个游戏引擎,其中包含许多使用由 glad 加载的 OpenGL 函数的方法,例如着色器、纹理和任何其他渲染相关的东西。但是,我将引擎导出为 dll(出于各种其他原因),并且 运行time 编辑器链接到该 dll。这个 运行time 编辑器也需要访问 glad 函数,因为它静态链接到 imgui,它需要相同的 window 上下文和所有内容,我假设我是否在 dll 中调用了 gladLoadGL()在 exe 中我会得到不同的函数指针,这意味着它们不会对相同的数据进行操作。有什么办法吗?我也尝试过将 GLFW 链接为 DLL,但这无济于事(这是有道理的,因为这是一个令人高兴的问题)。如果我不在我的 exe 中执行 gladLoadGL() ,我在尝试执行 gl 函数时会得到 nullptr 异常(因为只有少数情况我在 运行time 编辑器中使用 glFunctions )。但是,如果我在我的 exe 中执行 运行 gladLoadGL(),它会加载新的函数指针,这会抛出所有内容,并且我会在 ImGui 中遇到错误,我假设这是因为 glad 在 DLL 和 exe 中加载了不同的函数指针.
这可以做到吗,还是我需要重新考虑我的整体架构?
编辑: 所以我原来的问题已经回答了,你不需要做任何特别的事情(除了加载DLL和exe中的glad函数)。然而,这在我的代码中引发了一个新问题,这似乎是实际问题所在。现在我在 DLL 中有一个 class,看起来像这样:
// 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 实例,那么对于每个 GLAD 函数指针,您将有两个指针变量。
但是,它们都指向同一个函数。它们毕竟是为同一个 OpenGL 上下文加载函数指针。所以这些指针将指向相同的函数。
因此,虽然从技术上讲您会浪费一些存储空间(因为 DLL 和 EXE 都需要指针变量),但只要加载指针时 OpenGL 上下文是最新的,它应该仍然可以正常运行。
有什么方法可以在 DLL 和 exe 中使用 Glad?我觉得可能存在问题,因为 DLL 有自己的内存 space,与 exe 分开,但我不确定我将如何重构我的代码来表示它。
我的情况是,我有一个游戏引擎,其中包含许多使用由 glad 加载的 OpenGL 函数的方法,例如着色器、纹理和任何其他渲染相关的东西。但是,我将引擎导出为 dll(出于各种其他原因),并且 运行time 编辑器链接到该 dll。这个 运行time 编辑器也需要访问 glad 函数,因为它静态链接到 imgui,它需要相同的 window 上下文和所有内容,我假设我是否在 dll 中调用了 gladLoadGL()在 exe 中我会得到不同的函数指针,这意味着它们不会对相同的数据进行操作。有什么办法吗?我也尝试过将 GLFW 链接为 DLL,但这无济于事(这是有道理的,因为这是一个令人高兴的问题)。如果我不在我的 exe 中执行 gladLoadGL() ,我在尝试执行 gl 函数时会得到 nullptr 异常(因为只有少数情况我在 运行time 编辑器中使用 glFunctions )。但是,如果我在我的 exe 中执行 运行 gladLoadGL(),它会加载新的函数指针,这会抛出所有内容,并且我会在 ImGui 中遇到错误,我假设这是因为 glad 在 DLL 和 exe 中加载了不同的函数指针.
这可以做到吗,还是我需要重新考虑我的整体架构?
编辑: 所以我原来的问题已经回答了,你不需要做任何特别的事情(除了加载DLL和exe中的glad函数)。然而,这在我的代码中引发了一个新问题,这似乎是实际问题所在。现在我在 DLL 中有一个 class,看起来像这样:
// 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 实例,那么对于每个 GLAD 函数指针,您将有两个指针变量。
但是,它们都指向同一个函数。它们毕竟是为同一个 OpenGL 上下文加载函数指针。所以这些指针将指向相同的函数。
因此,虽然从技术上讲您会浪费一些存储空间(因为 DLL 和 EXE 都需要指针变量),但只要加载指针时 OpenGL 上下文是最新的,它应该仍然可以正常运行。