如何在可执行文件和DLL之间使用OpenGL函数指针?

如何在可执行文件和DLL之间使用OpenGL函数指针?,opengl,dll,rust,shared-libraries,Opengl,Dll,Rust,Shared Libraries,我正在尝试用Rust制作一个基于插件的游戏,我遇到了一些困难。我制作插件的方式是通过在上共享的方法。在运行时,我将从插件中动态加载所有必要的函数,并在以后需要运行时运行它们。 我的问题是使用OpenGL用其中一个插件的代码将东西绘制到屏幕上。在我的游戏的可执行文件中,我从插件加载所有函数(目前只有一个函数),创建GLFW窗口,并按照下面显示的代码从加载OpenGL函数指针 在游戏的循环中,我从插件调用加载的函数,drawvao while !window.should_close() { pro

我正在尝试用Rust制作一个基于插件的游戏,我遇到了一些困难。我制作插件的方式是通过在上共享的方法。在运行时,我将从插件中动态加载所有必要的函数,并在以后需要运行时运行它们。
我的问题是使用OpenGL用其中一个插件的代码将东西绘制到屏幕上。在我的游戏的可执行文件中,我从插件加载所有函数(目前只有一个函数),创建GLFW窗口,并按照下面显示的代码从加载OpenGL函数指针

在游戏的循环中,我从插件调用加载的函数,
drawvao

while !window.should_close() {
process_events(&mut window, &events);

unsafe {
gl::ClearColor(0.2, 0.3, 0.3, 1.0);
gl::Clear(gl::COLOR_BUFFER_BIT);
             
drawvao(shaderProgram, VAO);
}

window.swap_buffers();
glfw.poll_events();
}

drawvao
中的代码失败,表示找不到OpenGL函数指针。

我如何做到这一点,同时不在每个插件中再次加载函数指针?

我曾想过制作一个名为
api
的中间板条箱,它们都作为依赖项,但仍将加载每个插件的函数指针,我不确定他们是否会吸引到GLFW窗口
我也想过从插件和游戏的外部DLL加载函数指针,但我不知道这是否有帮助。我知道该解决方案在.NET语言中可以工作,但是,除非我弄错了,否则它在Rust中不会以同样的方式工作

而不是在每个插件中再次加载函数指针

你不能。除非您正在使用的可执行文件导出所有这些OpenGL函数指针,或者您正在导入一个导出这些函数指针的公共DLL


每个DLL和可执行文件都是不同的,并且在大多数情况下完全独立于其他可执行文件。除非他们明确地共享某个东西,否则它就不会被共享。而且大多数程序没有显式共享它们的OpenGL函数指针,因此您必须自己加载它们。

好的,谢谢!我希望事情不会变成那样。我想我会尝试寻找原始绑定:/
while !window.should_close() {
process_events(&mut window, &events);

unsafe {
gl::ClearColor(0.2, 0.3, 0.3, 1.0);
gl::Clear(gl::COLOR_BUFFER_BIT);
             
drawvao(shaderProgram, VAO);
}

window.swap_buffers();
glfw.poll_events();
}
pub extern "C" fn drawvao(shaderProgram: u32, Vao: u32){
gl::UseProgram(shaderProgram);
gl::BindVertexArray(VAO);
gl::DrawArrays(gl::TRIANGLES, 0, 3);
}