如何编写静态或动态的C ++库?

时间:2018-04-22 12:04:27

标签: c++ opengl glut freeglut

我希望在我的OpenGL程序中调用代码作为函数。我的问题是:

  1. 是否可以在main()?
  2. 之外调用glutIdleFunc()
  3. 我可以将下面的代码作为一个功能在我的主程序中作为开关案例功能调用吗? 3.如何将整个c ++过剩程序编写为可以在另一个程序中调用的函数?

    #include<GL/glut.h>
    #include<math.h>
    #include<stdio.h>
    int bzco[4][2]={{0,0},{49,201},{201,99},{320,300}},c[4],n=3;
    int s1x,s1y,s2x,s2y;
    void bezierCoefficients(int n,int *c)
    {
        int k,i;
        for(k=0;k<=n;k++)
        {
            c[k]=1;
    
            for(i=n;i>=k+1;i--)
                c[k]*=i;
    
            for(i=n-k;i>=2;i--)
                c[k]/=i;
        }
    }
    
    void display(void)
    {
    int k;
    
    float x,y,u,blend;
    
        glClear(GL_COLOR_BUFFER_BIT);
        // To draw points
        glColor3f(0.0,1.0,0.0);
        glPointSize(3);
            glBegin(GL_POINTS);
            glVertex2f(80, 34);
            glVertex2f(85, 24);
            glVertex2f(78, 24);
            glVertex2f(46, 35);
            glVertex2f(67, 47);
            glVertex2f(85, 26);
            glVertex2f(78, 68);
            glVertex2f(86, 56);
            glVertex2f(82, 54);
            glVertex2f(56, 69);
        glEnd();
        glColor3f(1.0,0.0,0.0);
        glPointSize(3);
        glBegin(GL_POINTS);
            glVertex2f(34, 38);
            glVertex2f(46, 35);
            glVertex2f(56, 69);
            glVertex2f(43, 47);
    
        glEnd();
        glColor3f(0.0,0.0,1.0);
        glLineWidth(3.0);
        glBegin(GL_LINE_STRIP);
    
        for(u=0;u<1.0;u+=0.001)
        {x=0;y=0;
            for(k=0;k<4;k++)
            {
                blend=c[k]*pow(u,k)*pow(1-u,n-k);
                x+=bzco[k][0]*blend;
                y+=bzco[k][1]*blend;
            }
            glVertex2f(x,y);
    
        }
        glEnd();
        glFlush();
        glutSwapBuffers();
    }
    void myinit()
    {
        glClearColor(1.0,1.0,1.0,1.0);
        glColor3f(1.0,0.0,0.0);
        glPointSize(5.0);
        gluOrtho2D(0.0,320.0,0.0,300.0);
    }
    void motion(void)
    {
        bzco[1][0]+=s1x;
        bzco[1][1]+=s1y;
        bzco[2][0]+=s2x;
        bzco[2][1]+=s2y;
        if(bzco[1][0]<0||bzco[1][0]>320)
        {
            s1x=-s1x;
        }
        if(bzco[1][1]<0||bzco[1][1]>300)
        {
            s1y=-s1y;
        }
        if(bzco[2][0]<0||bzco[2][0]>320)
        {
            s2x=-s2x;
        }
        if(bzco[2][1]<0||bzco[2][1]>300)
        {
            s2y=-s2y;
        }
        glutPostRedisplay();
    }
    

    主要功能:

    int main(int argc, char ** argv)
    {
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
        glutInitWindowSize(320,300);
        glutCreateWindow("Logistic Function");
        glutDisplayFunc(display);
        glutDisplayFunc(display);
        glutIdleFunc(motion);
        myinit();
        bezierCoefficients(n,c);
        s1x=-1;s1y=-1;s2x=-1;s2y=1;
        glutMainLoop();
        return 0;
    }
    
  4. 在我的主程序中,我在display()函数中使用switch case,因为我必须调用上面的代码。

1 个答案:

答案 0 :(得分:2)

您应该创建一个库,将您的函数放入其中,然后将它们导出以便能够从另一个应用程序访问它们。要在visual c ++编译器中导出函数,必须按如下方式声明它们:

void __declspec(dllexport) motion();

稍后您必须在应用程序中导入它才能使用它:

void __declspec(dllimport) motion();

您可以像这样声明像MY_API这样的宏:

#if (defined(_WIN32) || defined(_WIN32_WCE)) && defined(MY_LIB_DYNAMIC)
#   if defined(MY_LIB_SOURCE)
#       define MY_API __declspec(dllexport)
#   else
#       define MY_API __declspec(dllimport) 
#   endif
#endif

#if !defined(MY_API)
#   if defined (__GNUC__) && (__GNUC__ >= 4)
#       define MY_API __attribute__((visibility("default")))
#   else
#       define MY_API
#   endif
#endif

然后宣布你的功能如下:

void MY_API motion();

它允许您使用相同的代码在visual c ++和gcc编译器中创建静态或动态库。如果要静态编译库,可以编译它和应用程序,而无需任何预处理器定义。如果要动态编译库,可以将MY_LIB_DYNAMIC和MY_LIB_SOURCE作为预处理器定义添加到编译器中,但只需使用MY_LIB_DYNAMIC作为预处理器定义编译应用程序。