我正在使用SuperBible v6提供的sb6 :: application框架开发一个OpenGL应用程序,虽然它在我的计算机上总能正常工作(即使我在我的DE之外运行可执行文件),我发送的其他人也没有它可以让它运行。它不是OpenGL版本的问题,因为我的朋友有v4.2。 (我有v4.3,但它是一个非常基本的程序,所以我非常怀疑我已经做了v4.3独有的任何事情)它可能与丢失的文件有关,因为窗口在他启动时立即关闭,但我无法弄清楚是什么文件。它可能是.dll或者其他东西(我假设我可以将任何所需的.dll放在与可执行文件相同的文件夹中)但我无法找出哪一个。我让我的朋友去运行DependencyWalker,我专门跟踪并向他发送了DependencyWalker说他失踪的那些,但仍然没有改进。
SuperBible绝对没有关于sb6 :: application类的文档,也没有提供有关如何设置可移植项目的任何信息。或者如果确实如此,即使经过数天的搜索,我也无法找到它。
不确定代码的哪些部分与post相关,但这里是sb6 :: application类的init()和startup()函数。
void init()
{
// Redirect output to this file.
//freopen("myoutput.txt", "w", stdout);
ready = false;
static const char title[] = "Forkits";
sb6::application::init();
memcpy(info.title, title, sizeof(title));
}
void save_viewport_size()
{
// Get the size of the window
glGetIntegerv(GL_VIEWPORT, m_viewport);
std::cout << m_viewport[0] << " " << m_viewport[1] << " " << m_viewport[2] << " " << m_viewport[3] << std::endl;
}
void startup(void)
{
// Check version
GLint version = 0;
//glGetFloatv(GL_VERSION, &version);
//glGetIntegerv(GL_VERSION, &version);
//std::cout << "Version number " << glGetString(GL_VERSION) << std::endl;
//printf("%s %s\n", glGetString(GL_RENDERER), glGetString(GL_VERSION));
// Save the size of the initial viewport
glGetIntegerv(GL_VIEWPORT, m_viewport);
std::cout << m_viewport[0] << " " << m_viewport[1] << " " << m_viewport[2] << " " << m_viewport[3] << std::endl;
program = glCreateProgram();
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, vs_source, NULL);
glCompileShader(vs);
print_shader_log(vs);
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, fs_source, NULL);
glCompileShader(fs);
print_shader_log(fs);
glAttachShader(program, vs);
glAttachShader(program, fs);
glLinkProgram(program);
print_linker_log(program);
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// Set parameters
glSamplerParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glSamplerParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glSamplerParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
// Set up alpha blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
ready = true;
flag_running = true;
int init_success = Forkits::init(&sprites);
logic = new std::thread(old_main);
}
答案 0 :(得分:0)
你是对的,你应该能够将.dll放在与可执行文件相同的目录中,它会起作用。 sb6可能依赖于你拥有的其他.dll,但你的朋友没有。或者更可能的是,你朋友的.dll已经过时了。这是一种调查途径。有趣的是,窗口成功打开,然后关闭。对我而言,这指出了设置OpenGL上下文的问题。你可以发布你调用的代码来设置OpenGL吗?
另一个,在我看来,更好的选择是从你的应用程序中删除sb6并切换到另一个更便携的应用程序框架。 Sb6仅用于练习,如果你想要一个更强大的框架我会切换。由于您只使用sb6完成了一个小项目,现在也是转换的绝佳时机,因为代码更改将是最小的并且(相对:)无痛。以下是我建议的几个库:
SDL - 我个人的最爱。它将完成从设置窗口,处理输入,网络,播放声音甚至线程等所有事情。它(声称)是完全便携的。但请注意。他们刚刚进行了一次重大更新(1.2到2.0),文档还没有完全赶上。
GLFW - 如果您正在制作专用的OpenGL应用程序,这可能是更好的选择。因为它是从头开始构建的,用于处理OpenGL(与SDL不同,SDL首先是一个窗口框架,并不关心你在窗口中放置什么),所以设置使用OpenGL会更快。
SFML - 似乎是SDL的变种。说实话,我之前没有用过这个,但如果你喜欢它,请告诉我它是怎么回事!
还有其他人,但这些是我听说过的三巨头。如果您对运行它们有任何疑问,请与我们联系。