GLEW 在自己的库中不起作用

Posted

技术标签:

【中文标题】GLEW 在自己的库中不起作用【英文标题】:GLEW doesn't work in own library 【发布时间】:2017-04-20 15:15:42 【问题描述】:

我创建了一个使用 GLEW 的库,并且我有下一段代码:

// ShaderProgram.hpp
#include <GL.hpp>
#include <vector>

namespace LIBRARY 
    class LIBRARY_API ShaderProgram 
    public:
        ShaderProgram() 
            // If I uncomment the code will works, but why it doesn't work without because I already initialize GLEW in the main() function
            // glewExperimental = GL_TRUE;
            // std::cout << (glewInit() == GLEW_OK) << "\n"; // <- Outputs true

            std::cout << (glCreateProgram) << "\n" // <- Null function!
            m_program = glCreateProgram(); // <- Here crash when trying to call glCreateProgram(), I mean it can't find the function
        
    ;

这是我的库代码的一部分。然后我创建了一个小应用程序来测试它,并使用 SFML 作为窗口:

int main() 
...

sf::Window window(sf::VideoMode(800, 600, 32), "OpenGL", sf::Style::Titlebar | sf::Style::Close, settings);
window.setFramerateLimit(60);

window.setActive(true);

glewExperimental = GL_TRUE;
std::cout << (glewInit() == GLEW_OK) << "\n"; // <- Outputs true

std::cout << (glCreateProgram) << "\n" // <- Not null function adress, so it's good!     

LIBRARY::ShaderProgram shaderProgram; // <- Here crash
...

所以,在 main() 中 glCreateProgram 不为空,它是一个可调用函数,但在库中为空,我不明白为什么,因为我在 glew init 之后调用库代码,正如它在我构建 ShaderProgram 的代码。

Thread 1 received signal SIGSEGV, Segmentation fault.
0x00000000 in ?? ()
(gdb) bt
#0  0x00000000 in ?? ()
#1  0x68a015a2 in LIBRARY::ShaderProgram::ShaderProgram() ()
   from path\to\my\library.dll
#2  0x00401843 in main ()

我不明白为什么 GL 在应用程序中有效,但在库中却没有。

编辑:编辑代码以更好地解释问题。

【问题讨论】:

在调试配置中编译您的 DLL + EXE,并使用调试器启动它。它可能会立即告诉您问题所在。 另外,您可能想查看和/或重用我的这个项目:github.com/Const-me/GL3Windows(MIT 许可证)。它虽小但相当完整,适用于 Windows 的现代 OpenGL 示例,带有 GLEW、着色器和 VBO。 在您的 GL.hpp 中使用 #include guards 看看是否有帮助。 最后一个输出来自调试器,我到处都包含警卫。问题是即使在 main() opengl 工作并且 GLEW 初始化成功,库也找不到 opengl 函数。 你是怎么知道Glew初始化成功的?无论之前发生什么,都可以打印“IT's OK”。 GBD 告诉 glCreateProgram 地址为 0,这意味着 glew 没有给你那个函数指针。 【参考方案1】:

问题是我正在静态链接 GLEW。通过动态链接解决。

【讨论】:

以上是关于GLEW 在自己的库中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

UPGRADINGPRODUCTCODE 条件在库中的 wixui_install.wxs 中不起作用

从库中选择图像在 Android 的 Fragment 类中不起作用

Spring @transactional 在存储库中不起作用

在 cpp 文件中使用内联命名空间中的类型在 MSVS 中不起作用

为啥这个嵌套的 SVG 在 Firefox 中不起作用?

jQuery UI 自动完成功能在 iOS 中不起作用