在Windows/Ubuntu下安装OpenGL环境(GLUT/freeglut)与跨平台编译(mingw/g++)
GLUT/freeglut 是什么? OpenGL 和它们有什么关系?
OpenGL只是一个标准,它的实现一般自带在操作系统里,只要确保显卡驱动足够新就可以使用。如果需要在程序里直接使用OpenGL,会有很多非常恶心的预备工作要做,而且可能还要专门为平台的差异写一些代码。要跳过这些工作,可以用一个utility库,直接使用它提供的函数,就不用操心那些细节了。这样的库新一点的有GLEW,因为开源所以安装相对方便(大不了丢进去一起编译),但各种教程和书里常见的是闭源的GLUT。由于GLUT的作者已经很久没更新过了(最后更新于2000年!= =),所以其他人另外做了一个接口兼容GLUT的freeglut,开源而且一直在维护中。
这篇文章介绍了怎样在 Linux(Ubuntu)和 Windows 下安装 GLUT/freeglut,以及如何编写能够跨平台编译的 Makefile 和代码。在 Windows 下可以安装 GLUT 或者 freeglut 其中的一个,不过建议安装后者。在 Ubuntu 下安装 freeglut即可。
Linux 下安装
Linux 下一般使用开源的 freeglut,安装相对于 windows 比较方便,比如 Ubuntu 下安装只要一行命令:
$ sudo apt-get install build-essential freeglut3 freeglut3-dev binutils-gold
Windows 下安装
在 Windows 下如果不使用 Visual Studio 系的环境,可以用 *nix 的命令行工具在 Windows 下的移植版,通常使用的是 mingw 系列套装。
建议直接使用 mingw 的包管理器下载安装需要的包,如果要像这篇文章一样能够用 g++ 和 Make 编译,最好安装 g++(gcc)、GNU Make 和 *nix 常用命令行工具的移植版,也就是在 mingw 的包管理器里选择安装 mingw-developer-toolkit
、mingw32-base
、mingw32-gcc-g++
和 msys-base
。
关于如何在 Windows 下安装 mingw 环境,这里不赘述,可以参考这个链接。安装完之后需要记得将 mingw/bin
和 mingw/msys/版本号/bin
加入 PATH
环境变量。设置完环境变量后打开 cmd(如果设置前已经打开了,需要关掉再开或者另开一个cmd),如果运行 make --version
,g++ --version
和 bash --version
可以看到相关的版本信息,就说明安装成功了,比如:
C:\Users\Administrator> make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. C:\Users\Administrator> g++ --version
g++ (GCC) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. C:\Users\Administrator>bash --version
GNU bash, version 3.1.23(1)-release (i686-pc-msys)
Copyright (C) 2005 Free Software Foundation, Inc.
1. 下载 GLUT/freeglut
如果安装 GLUT,地址在:https://user.xmission.com/~nate/glut.html,下载 glut-3.7.6-bin.zip(已经十几年没更新过了所以就是这个版本了2333)
freeglut 在地址:http://www.transmissionzero.co.uk/software/freeglut-devel/ ,点击 Download freeglut 2.8.1-1 for MinGW
2. 放置头文件和库文件(GLUT)
解压下载到的zip,里面就是相关的头文件和库文件了。
对于 GLUT 而言,因为glut.dll 是32位的,所以在64位系统下放在C:\Windows\SysWOW64,32位系统下放在C:\Windows\System32。另外无论系统直接放在C:\Windows也可以。glut.h 放到mingw/include/GL,glut32.lib 放到mingw/lib。
比如一个64位系统的mingw安装在D:/mingw,GLUT 放完之后大概是这样:
C:\Windows\SysWOW64
└─ glut.dll
D:\mingw
├─ include
│ └─ GL
│ └─ glut.h
└─ lib
└─ glut32.lib
2. 放置头文件和库文件(freeglut)
放置如下,因为mingw如果不用64位的port(mingw-w64)的话只有32位,所以这里使用32位的文件。
C:\Windows\SysWOW64
└─ freeglut.dll (32位的mingw就用bin目录下那个,不是bin/x64那个)
D:\mingw
├─ include
│ └─ GL
│ ├─ freeglut.h
│ ├─ freeglut_ext.h
│ ├─ freeglut_std.h
│ └─ glut.h (注意这个和老版的glut.h不同)
└─ lib
├─ libfreeglut.a (这两个同样用lib目录下的两个)
└─ libfreeglut_static.a
一般操作系统会自带 glu32.dll, mingw 在安装的时候就会带上一些头文件在 include/GL,lib 里也有opengl和glu的库文件,看到不需要奇怪。
如果熟悉自己的工具,更喜欢自己编译连接时指定库文件和头文件位置,这一步可以跳过,放在自己觉得合适的地方,只要在工程/Makefile声明路径即可。
配置编译/链接参数
GLUT
- 编译参数需要加上加
-DGLUT_DISABLE_ATEXIT_HACK
(也可以在代码里#define GLUT_DISABLE_ATEXIT_HACK
) - 链接参数加上
-lopengl32 -lglu32 -lglut32
freeglut (Windows)
- 不需要特别的编译参数
- 链接参数为
-lfreeglut -lopengl32 -Wl,--subsystem,windows。
freeglut (Linux)
- 不需要特别的编译参数
- 链接参数为
-lGL -lglut。
mingw 本身就是 32 位,所以不需要特别设置。如果是用的 mingw-w64,还需要在参数里加上 -m32
代码里使用头文件
在 windows 下使用 GLUT 的函数前需要引用以下两个头文件
#include <windows.h>
#include <GL/glut.h>
顺序不能反。一般教程或者样例代码里如果不是针对win32平台不会有#include <windows.h>
,很多东西的定义就找不到了,所以跑之前要检查。如果要自动检测操作系统的话进行条件编译的话,就是这样
#if defined(_WIN32) || defined(WIN32)
#include <windows.h>
#endif
例子
Makefile
如果用的是使用 mingw 的 IDE,只要记得在里面配置步骤 3 的参数即可(一般在project或者build之类的选项里)。
GLUT 使用的 Makefile
LDFLAGS=-lopengl32 -lglu32 -lglut32
CFLAGS=-g -DDEBUG -DGLUT_DISABLE_ATEXIT_HACK
all:
g++ main.cpp -c -o main.o $(CFLAGS)
g++ main.o $(LDFLAGS) -o main.exe clean:
rm main.o main.exe
freeglut 使用的 Makefile
LDFLAGS=-lfreeglut -lopengl32 -Wl,--subsystem,windows
CFLAGS=-g -DDEBUG all:
g++ main.cpp -c -o main.o $(CFLAGS)
g++ main.o $(LDFLAGS) -o main.exe clean:
rm main.o main.exe
使用freeglut,跨平台支持的 Makefile
ifeq ($(OS),Windows_NT)
LDFLAGS=-lfreeglut -lopengl32 -Wl,--subsystem,windows
EXECUTABLE=main.exe
else
LDFLAGS=-lGL -lglut
EXECUTABLE=main
endif CFLAGS=-g -DDEBUG all:
g++ main.cpp -c -o main.o $(CFLAGS)
g++ main.o $(LDFLAGS) -o $(EXECUTABLE) clean:
rm main.o $(EXECUTABLE)
程序main.cpp
,来自OpenGL Code Samples,注意windows下要添加 windows.h:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#if defined(_WIN32) || defined(WIN32)
#include <windows.h>
#endif
#include <GL/glut.h> GLenum doubleBuffer;
GLint thing1, thing2; static void Init(void)
{ glClearColor(0.0, 0.0, 0.0, 0.0);
glClearAccum(0.0, 0.0, 0.0, 0.0); thing1 = glGenLists();
glNewList(thing1, GL_COMPILE);
glColor3f(1.0, 0.0, 0.0);
glRectf(-1.0, -1.0, 1.0, 0.0);
glEndList(); thing2 = glGenLists();
glNewList(thing2, GL_COMPILE);
glColor3f(0.0, 1.0, 0.0);
glRectf(0.0, -1.0, 1.0, 1.0);
glEndList();
} static void Reshape(int width, int height)
{ glViewport(, , width, height); glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
} static void Key(unsigned char key, int x, int y)
{ switch (key) {
case '':
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glutPostRedisplay();
break;
case '':
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glutPostRedisplay();
break;
case :
exit();
}
} static void Draw(void)
{ glPushMatrix(); glScalef(0.8, 0.8, 1.0); glClear(GL_COLOR_BUFFER_BIT);
glCallList(thing1);
glAccum(GL_LOAD, 0.5); glClear(GL_COLOR_BUFFER_BIT);
glCallList(thing2);
glAccum(GL_ACCUM, 0.5); glAccum(GL_RETURN, 1.0); glPopMatrix(); if (doubleBuffer) {
glutSwapBuffers();
} else {
glFlush();
}
} static void Args(int argc, char **argv)
{
GLint i; doubleBuffer = GL_FALSE; for (i = ; i < argc; i++) {
if (strcmp(argv[i], "-sb") == ) {
doubleBuffer = GL_FALSE;
} else if (strcmp(argv[i], "-db") == ) {
doubleBuffer = GL_TRUE;
}
}
} int main(int argc, char **argv)
{
GLenum type; glutInit(&argc, argv);
Args(argc, argv); type = GLUT_RGB | GLUT_ACCUM;
type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
glutInitDisplayMode(type);
glutInitWindowSize(, );
glutCreateWindow("Accum Test"); Init(); glutReshapeFunc(Reshape);
glutKeyboardFunc(Key);
glutDisplayFunc(Draw);
glutMainLoop();
}
运行结果
Windows 下
Ubuntu 下
在Windows/Ubuntu下安装OpenGL环境(GLUT/freeglut)与跨平台编译(mingw/g++)的更多相关文章
- Fedora和Ubuntu下安装OpenGL开发环境配置
Fedora下OpenGl开发环境配置 开发OpenGL工程需要3个库文件和对应的头文件: libglut.so,libGLU.so,libGL.so, gl.h ,glu.h, glut.h 这些库 ...
- OpenGL学习之windows下安装opengl的glut库
OpenGL学习之windows下安装opengl的glut库 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装. Windows环境下的GLUT下载地址:(大小约为15 ...
- Ubuntu下安装GTK环境
要生成C图形界面的程序,得安装GTK环境 安装GTK环境只要安装一个gnome-core-devel就可以了,里面集成了很多其他的包.除此之外还要转一些其他的 东西,如libglib2.0 ...
- ubuntu下搭建openGL环境
1. 建立基本编译环境 sudo apt-get install build-essential 2. 安装OpenGL Library sudo apt-get install ...
- ubuntu下安装lamp环境
使用普通用户来安装lamp环境: 1.安装apache: sudo apt-get install apache2
- ubuntu下安装boost环境
改自 http://blog.chinaunix.net/uid-12226757-id-3427282.html =============第一种: 也是最简单的:进入linux系统后,输入 # ...
- ubuntu下安装 java环境
步骤1:下载jdk 我选择的jdk版本文件: jdk-8u201-linux-x64.tar 官网下载链接 步骤2:创建单独的目录 sudo mkdir /usr/local/java 步骤3:将下载 ...
- Ubuntu 下安装LEMP环境 实战
---恢复内容开始--- 1.nginx的服务端的安装 打开命令行终端,在终端输入,sudo apt-get install nginx 回车即开始安装 kxlc-t@ubuntu:~$ sudo ...
- ubuntu下安装LAMP环境遇到的一些小问题
0x00 今天在服务器上重新弄了一下lamp环境 安装的过程中遇到了不少小问题 记录一下解决的方案吧 服务器安装的是ubuntu 16.04.1 0x01 首先在用 apt-get install 安 ...
随机推荐
- 每周一道数据结构(四)A*算法&博弈树α-β剪枝
A*算法/博弈树 前阵子考试学了A*算法.博弈树和回溯,自己真是愚蠢至极,根本没就搞明白这些,所以对于这些算法问道的话就不能说清楚,也记不住,所以才有了这篇笔记.在这里感谢面试我的那位工程师~~ A* ...
- [JS4] 最简单JS框架
<html> <head> <title></title> <SCRIPT TYPE="text/JavaScript"> ...
- C#——Dictionary<TKey, TValue> 计算向量的余弦值
说明:三角函数的余弦值Cos我想,每个学计算机的理工人都知道,但是真的明白它的用途,我也是刚明白.每个人在初中或者高中的时候,都有这么个疑惑,学三角函数干什么用的?很直白的答案就是考试用的.而且当时的 ...
- Atitit. js mvc 总结(2)----angular 跟 Knockout o99 最佳实践
Atitit. js mvc 总结(2)----angular 跟 Knockout o99 最佳实践 1. 框架 angular 跟Knockout 1 2. 2. 简单的列表绑定:Knockou ...
- 首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能。(已完善)
package java1; public class Account { String zhanghao; double yue=0; double add; double get; Account ...
- 转:最简单的视频网站(JavaEE+FFmpeg)
本文记录一个最简单的视频网站系统.此前做过一些基于JavaEE中的 SSH (Strut2 + Spring + Hibernate)的网站系统,但是一直没有做过一个视频网站系统,所以就打算做一个&q ...
- 在Windows下使用Nodist进行Node版本控制
完全卸载Node.js 首先卸载Node.js应用程序 确认在C:\Program Files中没有Nodejs目录 确认在C:\Program Files (x86)没有Nodejs目录 删除C:\ ...
- IOS适配
• Default.png(图片尺寸为320x480):显示在非Retina-3.5英寸屏幕上(iPhone3G\iPhone3GS,屏幕分辨率为320x480) • Default@2x.png(图 ...
- ThinkBox DOC
插件源码下载 @github https://github.com/Aoiujz/ThinkBox.git 插件使用方法 引入文件 //使用ThinkBox弹出框必须引入以上三个文件. //jQuer ...
- WPF 触发器
属性触发器:数据触发器:事件触发器