【问题标题】:How to initialize glut with fake parameters?如何用假参数初始化 glut?
【发布时间】:2012-02-15 00:06:56
【问题描述】:

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

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

我尝试过这样的事情:

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

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

【问题讨论】:

    标签: c++ opengl glut glew


    【解决方案1】:

    你可以这样做:

    #include <GL/freeglut.h>
    
    int main()
    {
      char fakeParam[] = "fake";
      char *fakeargv[] = { fakeParam, NULL };
      int fakeargc = 1;
    
      glutInit( &fakeargc, fakeargv );
    
      //...
    }
    

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

    【讨论】:

      【解决方案2】:

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

      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);
      

      【讨论】:

        【解决方案3】:

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

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

        (注意取消引用。)

        似乎glutInit() 确实需要最少的进程名称,尽管手册页没有说明这一点。

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-10-03
            • 1970-01-01
            • 2016-12-04
            • 2017-06-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多