4

我正在使用 opengl,使用 GLUT 和 GLEW 库为某个应用程序创建插件。

这个插件不是以简单的 int main(argc, argv) 开头的。所以我不能将这些值传递给 glutInit()。

我试过这样的事情:

glutInit(0, NULL); <--- Crash
GLenum err = glewInit();

但是当它试图调用 glutInit() 函数时我崩溃了。我可以如何重建这些参数,这样它就不会崩溃并且仍然能够使用 Glut 库..?

4

4 回答 4

7

你可以这样做:

#include <GL/freeglut.h>

int main()
{
  char fakeParam[] = "fake";
  char *fakeargv[] = { fakeParam, NULL };
  int fakeargc = 1;

  glutInit( &fakeargc, fakeargv );

  //...
}

但请注意,这是一个丑陋的黑客。

于 2012-01-20T12:11:27.657 回答
4

即使您没有任何参数,您也可能必须glutInit使用有效参数进行调用:argv

char *my_argv[] = { "myprogram", NULL };
int   my_argc = 1;
glutInit(&my_argc, my_argv);

编辑

也可能是第一个参数是一个指向的指针int,它不能为NULL?那么只传递一个有效的argc参数就足够了:

int my_argc = 0;
glutInit(&my_argc, NULL);
于 2012-01-20T12:11:51.587 回答
3

请注意源代码 ( ) 中的以下代码freeglut_init.c:677

void FGAPIENTRY glutInit( int* pargc, char** argv )
{
    char* displayName = NULL;
    char* geometry = NULL;
    int i, j, argc = *pargc;
    ...

(注意取消引用。)

似乎glutInit()确实需要最少的进程名称,尽管手册页对此没有任何说明。

于 2012-01-20T12:17:49.137 回答
0

我建议将此作为初始化 glut 应用程序的事实标准。

static inline void glutInstall()
{
    char *glut_argv[] = { 
        "", 
        (char *)0  
    };
    int glut_argc = 0; 

    glutInit(&my_argc, my_argv);
}

这个函数可以在每个应用程序的基础上进行修改,为 glut 提供它需要的参数(如果有的话),同时永久解决每个人都问你为什么将命令行参数传递给 3rd 方库的问题。

于 2016-04-16T00:22:37.750 回答