【发布时间】: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 没有给你那个函数指针。
标签: c++ opengl segmentation-fault glew