MinGW+OpenGL+freeglut+glew+glfw 环境配置

头像
523066680
Administrator
Administrator
帖子: 347
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 31 times
Been thanked: 31 times
联系:

MinGW+OpenGL+freeglut+glew+glfw 环境配置

帖子 #1 523066680 » 2016年09月26日 00:17

系统:Win7 64位

  1. MinGW离线安装,两种资源:
    1. http://nuwen.net/mingw.html
    2. http://tdm-gcc.tdragon.net/
    自带了OpenGL的库文件

  2. Cmake

  3. FreeGLUT(实用工具库,主要是方便建立视窗和交互)

    1. 预编译版本:http://www.transmissionzero.co.uk/software/freeglut-devel/
      选择下载 Download freeglut 3.0.0 for MinGW
      动态库Dll 和 编译链接时需要的lib都已经在里面了。
      解压的文件位置(示例):D:\OGL\freeglut-MinGW-3.0.0-1.mp
    2. 手动编译
      从官网下载 freeglut-3.0.0.tar.gz ,解压,示例目录 D:\OGL\freeglut-3.0.0,命令行进入该目录
      执行:cmake -G"MinGW Makefiles" .
      注意MinGW Makefiles的大小写不能错,然后,
      执行:make
      中断,提示 permission denied, 使用Administrator权限进入该目录,执行
      set path=%path%;c:\mingw\bin
      make
      没有错误提示,生成示例程序位于 D:\OGL\freeglut-3.0.0\bin 目录

    === 如果只是编译运行简单的GL程序(比如业余玩玩的),以上环境就够用了。编译示例请移步2楼 ===

  4. GLEW(自动识别平台所支持的OpenGL高级扩展函数以及使用接口)
    需要的工具:MSYS2.0
    GLEW主页:http://glew.sourceforge.net/
    下载页面:https://sourceforge.net/projects/glew/files/glew/2.0.0/
    对于mingw,应选择 glew-2.0.0.zip,解压位置(示例):D:\OGL\glew2.0.0
    这里面的静态、动态库都是需要手动编译的,通过系统菜单打开 "MinGW-w64 Win32 Shell" (注意是32位版本的)
    执行make命令,得到类似下方的输出,有一些错误,但是库文件可以用。(编译 glew1.3.0 时没有这些问题)

    Code: [全选] [展开/收缩] [Download] (Untitled.txt)
    1. VSUS@VIC-PC MINGW32 ~
    2. $ cd "D:\OGL\glew-2.0.0"
    3.  
    4. VSUS@VIC-PC MINGW32 /d/OGL/glew-2.0.0
    5. $ make
    6. sed \
    7.         -e "s|@prefix@|/usr|g" \
    8.         -e "s|@libdir@|/usr/lib|g" \
    9.         -e "s|@exec_prefix@|/usr/bin|g" \
    10.         -e "s|@includedir@|/usr/include/GL|g" \
    11.         -e "s|@version@|2.0.0|g" \
    12.         -e "s|@cflags@||g" \
    13.         -e "s|@libname@|glew32|g" \
    14.         -e "s|@requireslib@|glu|g" \
    15.         < glew.pc.in > glew.pc
    16. gcc -fno-builtin -O2 -Wall -W -Iinclude -fno-builtin -fno-stack-protector -o bin/glewinfo.exe tmp/mingw/default/shared/glewinfo.o -Llib  -lglew32 -L/mingw/lib -nostdlib -lopengl32 -lgdi32 -luser32 -lkernel32
    17. tmp/mingw/default/shared/glewinfo.o:glewinfo.c:(.text+0x30): undefined reference to `fprintf'
    18. tmp/mingw/default/shared/glewinfo.o:glewinfo.c:(.text+0x5a): undefined reference to `strlen'
    19. ...
    20. tmp/mingw/default/shared/glewinfo.o:glewinfo.c:(.text.startup+0x1980): undefined reference to `__imp___iob_func'
    21. tmp/mingw/default/shared/glewinfo.o:glewinfo.c:(.text.startup+0x1993): undefined reference to `fprintf'
    22. collect2.exe: error: ld returned 1 exit status
    23. makefile:176: recipe for target 'bin/glewinfo.exe' failed
    24. make: *** [bin/glewinfo.exe] Error 1

  5. GLFW
    官网:http://www.glfw.org/
    1. 预编译版本(只有库文件,没有提供示例代码和程序)Windows pre-compiled binaries
    2. 手动编译
      例如下载到的压缩包是 glfw-3.1.1.zip,解压,命令行进入该目录,
      > cmake -G"MinGW Makefiles" .
      > make
      无误的话,会在 glfw-3.1.1\examples 目录内生成示例程序,可以试运行看看。
      库文件位置 glfw-3.1.1\src\libglfw3.a

头像
523066680
Administrator
Administrator
帖子: 347
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 31 times
Been thanked: 31 times
联系:

MinGW+GL+FreeGLUT 固定渲染管线编译示例

帖子 #2 523066680 » 2016年09月26日 00:32

示例代码
Code: [全选] [展开/收缩] [Download] (VortexTorus_Per.c)
  1. /*
  2.     Torus_Vortex.c
  3.     Code by 523066680, 2013-02-05
  4.     paktcmail@gmail.com
  5.  
  6.     Imitate whirlpool effect
  7. */
  8.  
  9. #include <GL/glut.h>
  10. #include <stdio.h>
  11. #include <unistd.h>
  12. #include <math.h>
  13.  
  14. #define SIZE_X 400
  15. #define SIZE_Y 400
  16. #define PI M_PI
  17.  
  18. const double PI2 = M_PI*2;
  19.  
  20. int winID;
  21. float keya = 1.0;
  22. float keyb = 0.0;
  23. unsigned int theVortex;
  24.  
  25. /* Torus_Vortex */
  26. void vortex(float R, float r)
  27. {
  28.     float x, y, mz, mx, c;
  29.     float m, n, o;
  30.     static float nparts=60.0, mparts=28.0;
  31.    
  32.     /* 单个环的细分数量; 整个环状物的细分数量 */
  33.     float tm, move, detail;  
  34.     detail = mparts / nparts;  
  35.    
  36.     /* 偏移量=mparts/nparts均值,使其最终形成一个回环 */
  37.     for (m = 0.0; m < mparts; m += 1.0)
  38.     {
  39.         c = (float)((int)m%2) * 0.9;
  40.         glColor3f(c, c, c);
  41.  
  42.         glBegin(GL_QUAD_STRIP);
  43.         move = 0.0;
  44.         for (n = 0.0; n <= nparts; n += 1.0)
  45.         {
  46.             move += detail;
  47.             x = r * cos( n / nparts * PI2 );
  48.             y = r * sin( n / nparts * PI2 );
  49.             for (o = 0.0; o <= 1.0; o+=1.0)
  50.             {
  51.                 tm = o + m + move;
  52.                 mx = (x+R) * cos( tm / mparts * PI2 );
  53.                 mz = (x+R) * sin( tm / mparts * PI2 );
  54.                 glVertex3f(mx, y, mz);
  55.             }
  56.         }
  57.         glEnd();
  58.     }
  59. }
  60.  
  61. void display(void)
  62. {
  63.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  64.     glPushMatrix();
  65.     glRotatef(keya, 1.0, 0.0, 0.0);
  66.     glRotatef(keyb, 0.0, -1.0, 0.0);
  67.     glCallList(theVortex);
  68.     glPopMatrix();
  69.     glutSwapBuffers();
  70. }
  71.  
  72. void idle(void)
  73. {
  74.     keyb += 1.0;
  75.     usleep(10000);
  76.     glutPostRedisplay();
  77. }
  78.  
  79. void reshape(int Width,int Height)
  80. {
  81.     static float fa = 32.0;
  82.     if (Width == Height)
  83.     {
  84.         glViewport(0, 0, Width, Height);
  85.     }
  86.     else if (Width>Height)
  87.     {
  88.         glViewport(0, 0, Height, Height);
  89.     }
  90.     else
  91.     {
  92.         glViewport(0, 0, Width, Width);
  93.     }
  94.    
  95.     glMatrixMode(GL_PROJECTION);
  96.     glLoadIdentity();
  97.     //glOrtho(-20.0,20.0,-20.0,20.0,-100.0,100.0);
  98.     //glFrustum(-10.0,10.0,-10.0,10.0,3.0,60.0);
  99.     gluPerspective(90.0,1.0,1.0,80.0);
  100.     glMatrixMode(GL_MODELVIEW);
  101.     glLoadIdentity();
  102.     gluLookAt(0.0,0.0,fa, 0.0,0.0,0.0, 0.0,1.0,fa);
  103. }
  104.  
  105. void keypress(unsigned char key, int mousex, int mousey)
  106. {
  107.     switch (key)
  108.     {
  109.         case 'q':
  110.             glutDestroyWindow(winID);
  111.             exit(0);
  112.             break;
  113.         case 'a':
  114.             keya+=1.0;
  115.             glutPostRedisplay();
  116.             break;
  117.     }
  118. }
  119.  
  120. void init(void)
  121. {
  122.     glClearColor(0.0, 0.0, 0.0, 0.0);
  123.     glLineWidth( 2.0 );
  124.     glEnable(GL_DEPTH_TEST);  //允许深度缓冲
  125.     theVortex=glGenLists(1);
  126.     glNewList(theVortex, GL_COMPILE);
  127.     vortex(20.0, 12.0);
  128.     glEndList();
  129. }
  130.  
  131. void main(int argc, char *argv[])
  132. {
  133.     glutInit(&argc, argv);
  134.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
  135.     glutInitWindowSize(SIZE_X, SIZE_Y);       //窗口大小
  136.     glutInitWindowPosition(200, 200);         //窗口位置
  137.     winID = glutCreateWindow("TorusVortex");  //窗口句柄
  138.     init();
  139.     glutDisplayFunc(display);
  140.     glutKeyboardFunc(keypress);
  141.     glutReshapeFunc(reshape);
  142.     glutIdleFunc(idle);
  143.     glutMainLoop();
  144. }

编译命令
  1. gcc "VortexTorus_Per.c" -o "VortexTorus_Per" -ID:\OGL\freeglut-MinGW-3.0.0-1.mp\include ^
  2.                    -LD:\OGL\freeglut-MinGW-3.0.0-1.mp\lib\x64 ^
  3.                    -lfreeglut -lopengl32 -lglu32

或者写Makefile
  1. MAIN=VortexTorus_Per
  2. CC=gcc
  3.  
  4. LIBDIR= -LD:/OGL/freeglut-MinGW-3.0.0-1.mp/lib/x64
  5. INCDIR= -ID:/OGL/freeglut-MinGW-3.0.0-1.mp/include
  6. LIBS= -lfreeglut -lopengl32 -lglu32
  7.  
  8. $MAIN:
  9.     ${CC}  -o ${MAIN} $(MAIN).c  ${INCDIR} ${LIBDIR} ${LIBS}


将 freeglut-MinGW-3.0.0-1.mp\bin\freeglut.dll 文件复制到运行环境中,然后运行。
Torus.png
Torus.png (24.96 KiB) 查看 1366 次
Torus.png
Torus.png (24.96 KiB) 查看 1366 次

附件:
basic.zip
(529.26 KiB) 下载 16 次
basic.zip
(529.26 KiB) 下载 16 次

头像
523066680
Administrator
Administrator
帖子: 347
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 31 times
Been thanked: 31 times
联系:

MinGW+GLFW 编译示例

帖子 #3 523066680 » 2016年11月25日 10:44

MinGW+GLFW 编译示例

http://www.glfw.org/documentation.html

gcc example.c -o example ^
-ID:\Lib\glfw-3.1.1\include ^
-LD:\Lib\glfw-3.1.1\lib ^
-lglfw3 -lopengl32 -lgdi32

Code: [全选] [展开/收缩] [Download] (example.c)
  1. #include <GLFW/glfw3.h>
  2.  
  3. int main(void)
  4. {
  5.     GLFWwindow* window;
  6.  
  7.     /* Initialize the library */
  8.     if (!glfwInit())
  9.         return -1;
  10.  
  11.     /* Create a windowed mode window and its OpenGL context */
  12.     window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
  13.     if (!window)
  14.     {
  15.         glfwTerminate();
  16.         return -1;
  17.     }
  18.  
  19.     /* Make the window's context current */
  20.     glfwMakeContextCurrent(window);
  21.  
  22.     /* Loop until the user closes the window */
  23.     while (!glfwWindowShouldClose(window))
  24.     {
  25.         /* Render here */
  26.         glClear(GL_COLOR_BUFFER_BIT);
  27.  
  28.         /* Swap front and back buffers */
  29.         glfwSwapBuffers(window);
  30.  
  31.         /* Poll for and process events */
  32.         glfwPollEvents();
  33.     }
  34.  
  35.     glfwTerminate();
  36.     return 0;
  37. }

头像
523066680
Administrator
Administrator
帖子: 347
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 31 times
Been thanked: 31 times
联系:

补充 GLEW 库的编译 (MinGW + Cmake)

帖子 #4 523066680 » 2017年01月11日 12:01

补充 GLEW 库的编译 (MinGW + Cmake)
下载 glew-2.0.0.zip ,解压

进入 glew-2.0.0\build\cmake 执行

$ cmake -G "MinGW Makefiles" .

-- Configuring done
CMake Error:
Error evaluating generator expression:
$<TARGET_PDB_FILE:glew>
TARGET_PDB_FILE is not supported by the target linker.

-- Generating done
-- Build files have been written to: D:/Lib/glew-2.0.0/build/cmake


错误提示不管,继续:

$ make

生成
libglew32.a
libglew32.dll.a
glew32.dll
glewinfo.exe
visualinfo.exe


回到 “OpenGL”

在线用户

用户浏览此论坛: 没有注册用户 和 3 访客