簡體   English   中英

如何編寫靜態或動態的C ++庫?

[英]How do I write a C++ library either static or dynamic?

我想在我的OpenGL程序中調用以下代碼作為函數。我的問題是:

  1. 可以在main()之外調用glutIdleFunc()嗎?
  2. 我可以在主程序中將以下代碼作為函數作為開關案例函數來調用嗎? 3.如何編寫一個完整的C ++ glut程序作為可以在另一個程序中調用的函數?

     #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=nk;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,nk); 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; } 

在我的主程序中,我在display()函數中使用了切換用例,因為我必須調用上面的代碼。

您應該創建一個庫,將函數放入其中,然后將其導出以便能夠從另一個應用程序訪問它們。 要在可視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作為預處理器定義來編譯應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM