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 在存储库中不起作用