最近因为工作需要,想看一下 OpenGL 的东西,就在笔记本上搭建了 OpenGL 的环境。
1. 下载 Mesa 的源码 MesaLib-8.0.4.tar.bz2
解压后, 运行 configure, 根据提示安装必要的包, 编译,安装
我安装到了 /usr/local/private 下面:
/usr/local/private$ tree .
.
├── include
│ ├── EGL
│ │ ├── eglext.h
│ │ ├── egl.h
│ │ ├── eglmesaext.h
│ │ └── eglplatform.h
│ ├── GL
│ │ ├── glext.h
│ │ ├── gl.h
│ │ ├── gl_mangle.h
│ │ ├── glu.h
│ │ ├── glu_mangle.h
│ │ ├── glut.h
│ │ ├── glxext.h
│ │ ├── glx.h
│ │ ├── glx_mangle.h
│ │ ├── internal
│ │ │ └── dri_interface.h
│ │ ├── osmesa.h
│ │ ├── vms_x_fix.h
│ │ ├── wglext.h
│ │ └── wmesa.h
│ └── KHR
│ └── khrplatform.h
└── lib
├── dri
│ ├── i915_dri.so
│ ├── i965_dri.so
│ ├── nouveau_vieux_dri.so
│ ├── r200_dri.so
│ ├── r300_dri.so
│ ├── r600_dri.so
│ ├── radeon_dri.so
│ ├── swrast_dri.so
│ └── vmwgfx_dri.so
├── libEGL.so -> libEGL.so.1
├── libEGL.so.1 -> libEGL.so.1.0
├── libEGL.so.1.0
├── libGL.so -> libGL.so.1
├── libGL.so.1 -> libGL.so.1.2
├── libGL.so.1.2
├── libGLU.so -> libGLU.so.1
├── libGLU.so.1 -> libGLU.so.1.3.08000
├── libGLU.so.1.3.08000
├── libglut.so -> libglut.so.3
├── libglut.so.3 -> libglut.so.3.7.1
├── libglut.so.3.7.1
└── pkgconfig
├── dri.pc
├── egl.pc
├── gl.pc
├── glu.pc
└── glut.pc
8 directories, 45 files
2.下载 GLUT 的源码 MesaGLUT-7.9.2.tar.bz2
因为编译 GLUT 需要使用编译 Mesa 的配置环境,所以,要在 Mesa-7.9.2下建几个链接:
:~/Code/mesa/Mesa-7.9.2$ ls -l
total 8
lrwxrwxrwx 1 charles charles 18 Aug 30 00:26 bin -> ../Mesa-8.0.2/bin/
lrwxrwxrwx 1 charles charles 21 Aug 30 00:26 configs -> ../Mesa-8.0.2/configs
drwxrwxr-x 3 charles charles 4096 Aug 30 00:25 include
lrwxrwxrwx 1 charles charles 17 Aug 30 00:56 lib -> ../Mesa-8.0.2/lib
drwxrwxr-x 3 charles charles 4096 Aug 30 00:25 src
然后即可以编译,但是在生成 lib文件的时候还是报错,说是 gcc 找不到,等等。
经过分析,原因是,有几个 glut的库的变量没有定义,在 src/glut/glx/Makefile 里面加入:
19 GLUT_LIB=glut
20 GLUT_LIB_NAME = lib$(GLUT_LIB).so
21 GLUT_LIB_GLOB = lib$(GLUT_LIB).*so*
然后就没有问题了。
3. 编译 GLEW.
进入目录, 然后:
~/Code/mesa/glew-1.9.0$ make GLEW_DEST=/usr/local/private
sudo make install GLEW_DEST=/usr/local/private
3. 下载 mesa-demos-8.0.1.tar.bz2
编译 demo 需要 GLEW 库。
glew代码可从 http://glew.sourceforge.net/ 下载到。
我想 把 glew库也放到 /usr/local/private下面,因此,编译代码的时候,执行
~/Code/mesa/glew-1.9.0$ make GLEW_DEST=/usr/local/private
这样,会把指定的路径写到 makefile 和配置文件中, make install 的时候,会把生成的库装到指定的路径。
安装的时候,也要指定安装目录:
:~/Code/mesa/glew-1.9.0$ sudo make GLEW_DEST=/usr/local/private install
4. 编译一个opengl 程序
比如,编译 opengl demo 里面的程序 fire.c, 可用如下的命令:
~/Code/mesa/mesa-demos-8.0.1/src/demos$ gcc fire.c ../util/readtex.c -o fire `pkg-config --cflags --libs gl glu glut` -I../util/ -lX11 -lXmu -lm -lXi
其实,还需要先设置一下 pkg-config的路径和 动态库的搜索路径
export PKG_CONFIG_PATH=/usr/local/private/lib/pkgconfig
export LD_LIBRARY_PATH=/usr/local/private/lib/
上面的 lXi 是动态库 /usr/lib/i386-linux-gnu/libXi.so.6,可用如下的方法查询它的信息,先查它属于哪个安装包:
apt-file search /usr/lib/i386-linux-gnu/libXi.so.6
libxi6: /usr/lib/i386-linux-gnu/libXi.so.6
libxi6: /usr/lib/i386-linux-gnu/libXi.so.6.1.0
libxi6-dbg: /usr/lib/debug/usr/lib/i386-linux-gnu/libXi.so.6.1.0
dpkg -S /usr/lib/i386-linux-gnu/libXi.so.6
libxi6: /usr/lib/i386-linux-gnu/libXi.so.6
然后查一下这个安装包的信息:
apt-cache show libxi6
Package: libxi6
Priority: optional
Section: libs
Installed-Size: 141
Maintainer: Ubuntu X-SWAT <ubuntu-x@lists.ubuntu.com>
Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org>
Architecture: i386
Source: libxi
Version: 2:1.6.0-0ubuntu2
Depends: libc6 (>= 2.4), libx11-6 (>= 2:1.4.99.1), libxext6
Pre-Depends: multiarch-support
Filename: pool/main/libx/libxi/libxi6_1.6.0-0ubuntu2_i386.deb
Description-en: X11 Input extension library
libXi provides an X Window System client interface to the XINPUT
extension to the X protocol.
.
The Input extension allows setup and configuration of multiple input devices,
and will soon allow hotplugging of input devices; to be added and removed on
the fly.
.