我正在使用 SuperBible v6 提供的 sb6::application 框架开发一个 OpenGL 应用程序,尽管它在我的计算机上始终运行良好(即使我在我的 DE 之外运行可执行文件),但我发送的其他人都没有它可以让它运行。这不是 OpenGL 版本的问题,因为我的 friend 有 v4.2。 (我有 v4.3,但它是一个非常基本的程序,所以我非常怀疑我是否做了 v4.3 独有的任何事情)它可能与丢失的文件有关,因为窗口在他启动时立即关闭,但我无法弄清楚是什么文件。它可能是一个 .dll 或其他东西(我假设我可以将任何需要的 .dll 放在与可执行文件相同的文件夹中)但我一直无法找出是哪个。我让我的 friend 跑了DependencyWalker,我特意找了下DependencyWalker说他漏的发给他,还是没有改善。
SuperBible 绝对没有关于 sb6::application 类的文档,也没有提供任何关于如何设置项目以使其可移植的信息。或者即使找到了,我也找不到它,即使经过几天的搜索。
不确定代码的哪些部分与发布相关,但这里是 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);
}
最佳答案
你是对的,你应该能够将 .dll 放在与可执行文件相同的目录中并且它会工作。 sb6 可能依赖于您拥有但您的 friend 没有的其他 .dll。或者更可能的是,您 friend 的 .dll 已过时。这是一种调查途径。有趣的是,窗口成功打开,然后关闭。对我来说,这表明设置 OpenGL 上下文存在问题。你能发布你调用的代码来设置 OpenGL 吗?
在我看来,另一个更好的方法是从您的应用程序中完全删除 sb6 并切换到另一个更便携的应用程序框架。 Sb6 仅用于练习,如果你想要一个更健壮的框架,我会切换。由于您只使用 sb6 完成了一个小项目,现在也是转换的绝佳时机,因为代码更改将是最小的并且(相对 :))无痛。以下是我推荐的几个库:
SDL - 我个人的最爱。它会做所有事情,从设置窗口、处理输入、网络、播放声音,甚至线程。而且它(声称)是完全便携的。但是,请注意。他们刚刚经历了一次重大更新(1.2 到 2.0),文档还没有完全跟上。
GLFW - 如果您正在制作专用的 OpenGL 应用程序,这可能是更好的选择。由于它是为与 OpenGL 一起工作而从头开始构建的(与 SDL 不同,SDL 首先是一个窗口框架并且不关心您在窗口中放置什么)它可以更快地设置为与 OpenGL 一起工作。
SFML - 似乎是 SDL 的变体。老实说,我以前没用过这个,但如果你喜欢,请告诉我它怎么样!
还有其他的,但这些是我听说过的三大巨头。如果您对运行它们有任何疑问,请告诉我。
关于c++ - 如何使 OpenGL SuperBible 6 应用程序可移植?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21978567/