Linux 3D Programming -- VTK 5.0安装指南
1. 首先在VTK的网站:http://www.vtk.org 上可以下载到VTK的源码(VTK不提供Precompiled binary版本,所以,VTK的安装都必须要手动自己编译),Down下来之后解开。VTK的网站上还有VTK Data下载,这是VTK Example程序运行时所需要的数据文件,如果我们想在安装完VTK后做一些演示和测试,那么就需要下载这个包。我的意见是不用下载了,VTK安装完成 后,我们用VTK网站上提供的两个Example Code,自己编译运行一下,就可以知道VTK有没有安装成功了。
2. 解开包,看到根目录下有一个README.html文件,这就是安装文档,基本上照这个做就OK了,但这篇文档中没有讲述CMake、Linux下的OpenGL库等一些前提知识,所以下面还是将安装步骤再讲一遍。
3. 首先看到VTK的安装需要cmake,这是kitware公司做的cross-platform的一个make工具。OK,那就先到 www.cmake.org下载cmake-2.2.3-x86-linux.tar.gz。解开发现里面有一个tar文件和一个readme,再解开 tar就OK了,由于下载的就是编译好的版本,所以无需再编译了。这里我的做法是将tar文件中的内容解压到了/usr/local目录下,这样, /usr/local/bin目录下就有cmake和ccmake这些可执行文件了。
4. cmake ready了,下面就按照文档的做法开始编译VTK了(以下假设VTK的source目录在/home/software/VTK)。首先,建一个专门用 于vtk编译的目录,单独建目录的好处时,如果下次需要重新编译源码,源码目录无需动,只需重新再建一个build目录就OK了。这里,我建了这样一个目 录:/home/software/VTK-build,然后进入到这个目录,输入ccmake ../VTK,此时ccmake的交互式界面就出来了(如果需要改变C和C++的编译器,请在执行ccmake ../VTK之前,export CC和CXX 两个环境变量即可),然后按下 c 键,表示开始configure,此时,configure结束后,ccmake报错,说无法自动找到OpenGL的include文件和OpenGL的 库(Linux下VTK是基于OpenGL的,OpenGL只提供了最基本的2D、3D绘图所需的点、线、面等元素,Solaris上可能就是GLX,对 于基于VTK的开发者来说,这些是透明的,因为VTK为上层开发者提供了一个统一的接口,开发者无需关心是什么平台,只需调用VTK的一个factory class的创建方法,即可得到一个当前平台的Render class),要我手动在ccmake的advance模式下设置OPENGL_INCLUDE_DIR和OPENGL_gl_LIBRARY两项。
5. 既如此,自然要解决这个问题,首先想到的是Mesa,这是当前Linux平台上OpenGL的一个最好实现,目前使用的人很多,所以,来到 http://www.mesa3d.org,下载了一个mesa 6.4.2,准备安装。mesa提供了MesaDemos,MesaLib和MesaGLUT三个东西,其中Demos不用说了,MesaLib就包含了 libGL.so.1、libGLU.so.1这些OpenGL的核心库,以及像glu.h等OpenGL的include头文件,所以,我们下载安装这 个MesaLib就OK了,至于MesaGLUT,我们都知道,GLUT是OpenGL Utility Toolkit,是在OpenGL的基础上做的一个简单封装和扩展,Mesa也实现相同的东西,所以叫MesaGLUT,这个东西可以不用装,因为VTK 只需要GL和GLU两个库,装上这个MesaGLUT也可以,我的建议还是装上为好,反正不用也占不了多少地方,况且,MesaDemos就需要 MesaGLUT才可以运行,也许将来其他的应用也需要GLUT才能运行呢?所以,一并装上。将MesaLib和MesaGLUT两个包解开后,出现一个 MesaXXX的目录,然后开始编译。
6. 按照Mesa网站的文档,首先来到Mesa源代码目录,执行make,列出了一堆支持的platform,最后有一个出错信息,但输出信息明确告诉我们可 以ignore这个错误,所以,继续执行命令:make linux-x86(根据make的输出信息决定后面platform的关键字),就开始编译Mesa的源码了。这里千万要注意的是,安装编译Mesa之 前需要首先安装XFree86的Develop包,这个在RedHat的光盘上有,没有安装这部分的请先装好这些再来安装Mesa(可使用Linux的添 加/删除程序工具来完成)。编译完后,执行make install,此时脚本会询问将Mesa装到什么地方,比如include文件到哪,lib文件到哪等等,默认情况是 /usr/local/include和/usr/local/lib下,这样就OK了,Easy!
7. 其实上述的做法,是编译安装了Mesa的Stand-alone/Xlib mode版本。意思就是这样编译出来的Mesa是依赖于XFree86的,是工作在XFree86上的;与此相反,Mesa还有一个 DRI/accelerated安装模式,所谓DRI,指的就是不依赖于XFree86,直接操作显卡,DRI也是一个opensource项目,如果要 使Mesa工作在DRI模式下,必须首先安装DRI,安装DRI还要改动Linux Kernel,有一些麻烦,所以这次没有这么做,但勿庸置疑的是,使用DRI,肯定性能会好很多,因为他直接操作显卡。目前,已经有很多的显卡厂商,如 ATI、NVIDIA都能支持DRI这个东东,所以,如果我们的绘图对性能要求很高,还是用DRI吧(如果Mesa用DRI模式编译,上面的make linux-x86的命令就要变成make linux-dri,不过远不是改个命令就OK了,具体还是看Mesa网站中Compilation/Installation一节吧)。
8. OK,Mesa安装完成后,我们可以用MesaDemos中带的程序来验证一下,要用MesaDemos,要安装MesaGLUT哦!MesaDemos 包解开后,会在我们刚才安装Mesa的目录下生成一个progs的目录,直接来到这个progs目录下make就OK!然后执行Mesa最有名的 gears程序,看能否运行就OK了!
9. VTK现在可以安装了,重新来,建立一个build目录,然后ccmake ../VTK,果然,这次,没有上述的错误信息了,在ccmake的界面中,可以配置VTK是否编译成shared library、改变CMAKE_INSTALL_PREFIX的一项还可以指定VTK安装到哪个目录下去,具体看VTK的那个README.html 吧,然后继续按 c 键,记住,这里只要我们对配置做了一些改动,就需要按下 c 键重新configure,直到没有改动时,就可以按下 g 键,生成Makefile了。OK,ccmake完了,可以make,直接输入make命令,开始编译VTK,这个过程非常漫长,要耐心等(因为编译C+ +程序比C程序慢多了),完成后输入make install,安装完毕!
10. 安装完成了,我们就可以来写个程序测测看了,用VTK官方的两个Example就OK,不过这里有三个问题需要注意:
(1)官方代码中的第一个,就是画一个Sphere的程序,需要将include语句中的""改成<>,因为我们在编译时会加入 -I,然后要在 #include <vtkActor.h>之前加入一句#include <vtkProperty.h>,因为vtkActor.h中这样定义了class vtkProperty; ,这在g++编译器中会被认为是forward declaration错误,即vtkProperty类之前没有定义过,这里不能这样引用,所以要加入一句#include <vtkProperty.h>。有些编译器就没这个毛病,gcc是有的。
(2)编译源码还需要链接很多vtk的库,这在vtk的文档中,建议我们用cmake来自动生成makefile,不过现在我还不会,因为刚接触vtk,所以,我们用笨办法,我写了这样一个编译命令,将/usr/local/lib下编译出来的所有vtk库都链进去:
g++ -o quadric -O3 -I/usr/local/include/vtk-5.0 -L/usr/local/lib -Wno-deprecated -lvtkCommon -lvtkDICOMParser -lvtkexoIIc -lvtkexpat -lvtkFiltering -lvtkfreetype -lvtkftgl -lvtkGenericFiltering -lvtkGraphics -lvtkHybrid -lvtkImaging -lvtkIO -lvtkjpeg -lvtkMPEG2Encode -lvtkNetCDF -lvtkpng -lvtkRendering -lvtksys -lvtktiff -lvtkVolumeRendering -lvtkWidgets -lvtkzlib quadric.cxx
这里可以看到,vtk的头文件在/usr/local/include/vtk-5.0目录下,库在/usr/local/lib目录下。
(3)编译源码的时候,gcc会说vtk的头文件什么不符合规范什么的,如果不想看到这些warning信息,就可以像上面的命令一样,在编译命令行加上一个-Wno-deprecated开关就OK了。
2. 解开包,看到根目录下有一个README.html文件,这就是安装文档,基本上照这个做就OK了,但这篇文档中没有讲述CMake、Linux下的OpenGL库等一些前提知识,所以下面还是将安装步骤再讲一遍。
3. 首先看到VTK的安装需要cmake,这是kitware公司做的cross-platform的一个make工具。OK,那就先到 www.cmake.org下载cmake-2.2.3-x86-linux.tar.gz。解开发现里面有一个tar文件和一个readme,再解开 tar就OK了,由于下载的就是编译好的版本,所以无需再编译了。这里我的做法是将tar文件中的内容解压到了/usr/local目录下,这样, /usr/local/bin目录下就有cmake和ccmake这些可执行文件了。
4. cmake ready了,下面就按照文档的做法开始编译VTK了(以下假设VTK的source目录在/home/software/VTK)。首先,建一个专门用 于vtk编译的目录,单独建目录的好处时,如果下次需要重新编译源码,源码目录无需动,只需重新再建一个build目录就OK了。这里,我建了这样一个目 录:/home/software/VTK-build,然后进入到这个目录,输入ccmake ../VTK,此时ccmake的交互式界面就出来了(如果需要改变C和C++的编译器,请在执行ccmake ../VTK之前,export CC和CXX 两个环境变量即可),然后按下 c 键,表示开始configure,此时,configure结束后,ccmake报错,说无法自动找到OpenGL的include文件和OpenGL的 库(Linux下VTK是基于OpenGL的,OpenGL只提供了最基本的2D、3D绘图所需的点、线、面等元素,Solaris上可能就是GLX,对 于基于VTK的开发者来说,这些是透明的,因为VTK为上层开发者提供了一个统一的接口,开发者无需关心是什么平台,只需调用VTK的一个factory class的创建方法,即可得到一个当前平台的Render class),要我手动在ccmake的advance模式下设置OPENGL_INCLUDE_DIR和OPENGL_gl_LIBRARY两项。
5. 既如此,自然要解决这个问题,首先想到的是Mesa,这是当前Linux平台上OpenGL的一个最好实现,目前使用的人很多,所以,来到 http://www.mesa3d.org,下载了一个mesa 6.4.2,准备安装。mesa提供了MesaDemos,MesaLib和MesaGLUT三个东西,其中Demos不用说了,MesaLib就包含了 libGL.so.1、libGLU.so.1这些OpenGL的核心库,以及像glu.h等OpenGL的include头文件,所以,我们下载安装这 个MesaLib就OK了,至于MesaGLUT,我们都知道,GLUT是OpenGL Utility Toolkit,是在OpenGL的基础上做的一个简单封装和扩展,Mesa也实现相同的东西,所以叫MesaGLUT,这个东西可以不用装,因为VTK 只需要GL和GLU两个库,装上这个MesaGLUT也可以,我的建议还是装上为好,反正不用也占不了多少地方,况且,MesaDemos就需要 MesaGLUT才可以运行,也许将来其他的应用也需要GLUT才能运行呢?所以,一并装上。将MesaLib和MesaGLUT两个包解开后,出现一个 MesaXXX的目录,然后开始编译。
6. 按照Mesa网站的文档,首先来到Mesa源代码目录,执行make,列出了一堆支持的platform,最后有一个出错信息,但输出信息明确告诉我们可 以ignore这个错误,所以,继续执行命令:make linux-x86(根据make的输出信息决定后面platform的关键字),就开始编译Mesa的源码了。这里千万要注意的是,安装编译Mesa之 前需要首先安装XFree86的Develop包,这个在RedHat的光盘上有,没有安装这部分的请先装好这些再来安装Mesa(可使用Linux的添 加/删除程序工具来完成)。编译完后,执行make install,此时脚本会询问将Mesa装到什么地方,比如include文件到哪,lib文件到哪等等,默认情况是 /usr/local/include和/usr/local/lib下,这样就OK了,Easy!
7. 其实上述的做法,是编译安装了Mesa的Stand-alone/Xlib mode版本。意思就是这样编译出来的Mesa是依赖于XFree86的,是工作在XFree86上的;与此相反,Mesa还有一个 DRI/accelerated安装模式,所谓DRI,指的就是不依赖于XFree86,直接操作显卡,DRI也是一个opensource项目,如果要 使Mesa工作在DRI模式下,必须首先安装DRI,安装DRI还要改动Linux Kernel,有一些麻烦,所以这次没有这么做,但勿庸置疑的是,使用DRI,肯定性能会好很多,因为他直接操作显卡。目前,已经有很多的显卡厂商,如 ATI、NVIDIA都能支持DRI这个东东,所以,如果我们的绘图对性能要求很高,还是用DRI吧(如果Mesa用DRI模式编译,上面的make linux-x86的命令就要变成make linux-dri,不过远不是改个命令就OK了,具体还是看Mesa网站中Compilation/Installation一节吧)。
8. OK,Mesa安装完成后,我们可以用MesaDemos中带的程序来验证一下,要用MesaDemos,要安装MesaGLUT哦!MesaDemos 包解开后,会在我们刚才安装Mesa的目录下生成一个progs的目录,直接来到这个progs目录下make就OK!然后执行Mesa最有名的 gears程序,看能否运行就OK了!
9. VTK现在可以安装了,重新来,建立一个build目录,然后ccmake ../VTK,果然,这次,没有上述的错误信息了,在ccmake的界面中,可以配置VTK是否编译成shared library、改变CMAKE_INSTALL_PREFIX的一项还可以指定VTK安装到哪个目录下去,具体看VTK的那个README.html 吧,然后继续按 c 键,记住,这里只要我们对配置做了一些改动,就需要按下 c 键重新configure,直到没有改动时,就可以按下 g 键,生成Makefile了。OK,ccmake完了,可以make,直接输入make命令,开始编译VTK,这个过程非常漫长,要耐心等(因为编译C+ +程序比C程序慢多了),完成后输入make install,安装完毕!
10. 安装完成了,我们就可以来写个程序测测看了,用VTK官方的两个Example就OK,不过这里有三个问题需要注意:
(1)官方代码中的第一个,就是画一个Sphere的程序,需要将include语句中的""改成<>,因为我们在编译时会加入 -I,然后要在 #include <vtkActor.h>之前加入一句#include <vtkProperty.h>,因为vtkActor.h中这样定义了class vtkProperty; ,这在g++编译器中会被认为是forward declaration错误,即vtkProperty类之前没有定义过,这里不能这样引用,所以要加入一句#include <vtkProperty.h>。有些编译器就没这个毛病,gcc是有的。
(2)编译源码还需要链接很多vtk的库,这在vtk的文档中,建议我们用cmake来自动生成makefile,不过现在我还不会,因为刚接触vtk,所以,我们用笨办法,我写了这样一个编译命令,将/usr/local/lib下编译出来的所有vtk库都链进去:
g++ -o quadric -O3 -I/usr/local/include/vtk-5.0 -L/usr/local/lib -Wno-deprecated -lvtkCommon -lvtkDICOMParser -lvtkexoIIc -lvtkexpat -lvtkFiltering -lvtkfreetype -lvtkftgl -lvtkGenericFiltering -lvtkGraphics -lvtkHybrid -lvtkImaging -lvtkIO -lvtkjpeg -lvtkMPEG2Encode -lvtkNetCDF -lvtkpng -lvtkRendering -lvtksys -lvtktiff -lvtkVolumeRendering -lvtkWidgets -lvtkzlib quadric.cxx
这里可以看到,vtk的头文件在/usr/local/include/vtk-5.0目录下,库在/usr/local/lib目录下。
(3)编译源码的时候,gcc会说vtk的头文件什么不符合规范什么的,如果不想看到这些warning信息,就可以像上面的命令一样,在编译命令行加上一个-Wno-deprecated开关就OK了。
11. 到此,VTK安装、测试完毕。这里还需要再提醒注意的是,编译代码的时候要加-I和-L开关,运行程序前要export LD_LIBRARY_PATH=/usr/local/lib,这样代码才能找到VTK和Mesa的库文件。尤其要注意的是,其实XFree86的包里 面也有libGL.so.1,就在/usr/X11R6/lib目录下(因为我装了KDE,KDE要用QT,而QT就需要OpenGL),但是我们现在用 Mesa,所以,执行程序前要export LD_LIBRARY_PATH=/usr/local/lib,让程序用正确的动态库!如果不放心,可以在export动作完成后,用ldd <executable file>命令查看一下可执行文件用到了哪些库文件,就可清楚的查看到程序是否用了正确的库了。
12. 其实现在考虑,应该不安装Mesa也可以,就用XFree86的库和Develop包中的头文件,反正本文中Mesa也是基于XFree86的,我看了一 下RedHat中libGL.so.1文件的来源,也是来自XFree86-Mesa-Lib XXXXXX这个RPM的,所以,其实也就是Mesa。换句话说,应该在安装完了XFree86的Develop Package后,libGL.so.1,gl.h, glu.h这些该有的东西也就都有了(都在/usr/include目录和/usr/lib目录下),所以,完全可以不用装Mesa(除非装Mesa的 DRI模式),不过这个没有试验过,只是目前想来,应该是完全可以的。毕竟RedHat的发行版中,OpenGL的这些东西都已经带了。
12. 其实现在考虑,应该不安装Mesa也可以,就用XFree86的库和Develop包中的头文件,反正本文中Mesa也是基于XFree86的,我看了一 下RedHat中libGL.so.1文件的来源,也是来自XFree86-Mesa-Lib XXXXXX这个RPM的,所以,其实也就是Mesa。换句话说,应该在安装完了XFree86的Develop Package后,libGL.so.1,gl.h, glu.h这些该有的东西也就都有了(都在/usr/include目录和/usr/lib目录下),所以,完全可以不用装Mesa(除非装Mesa的 DRI模式),不过这个没有试验过,只是目前想来,应该是完全可以的。毕竟RedHat的发行版中,OpenGL的这些东西都已经带了。
再补充一个:“什么是DRI”--官方解释
The Direct Rendering Infrastructure, also known as the DRI, is a framework for allowing direct access to graphics hardware under the X Window System in a safe and efficient manner. It includes changes to the X server, to several client libraries, and to the kernel. The first major use for the DRI is to create fast OpenGL implementations.
The DRI is an integral part of XFree86 4.x , and integrates with Mesa, an open source implementation of the OpenGL API. Several 3D accelerated drivers have been written to the DRI specification, including drivers for chipsets produced by ATI, Matrox, 3DFX, and Intel.
The DRI was initially developed by Precision Insight, Inc. (PI) in cooperation with, and partially funded by Red Hat Inc., and SGI. Since PI's merger with VA Linux, and VA Linux' subsequent exit from Linux, the DRI is being maintained by Tungsten Graphics Inc., a new company formed by some of the initial DRI developers from PI. Tungsten Graphics is the current focal point for all DRI development, and many open source developers continue to contribute to the project through the DRI sourceforge project.
The Direct Rendering Infrastructure, also known as the DRI, is a framework for allowing direct access to graphics hardware under the X Window System in a safe and efficient manner. It includes changes to the X server, to several client libraries, and to the kernel. The first major use for the DRI is to create fast OpenGL implementations.
The DRI is an integral part of XFree86 4.x , and integrates with Mesa, an open source implementation of the OpenGL API. Several 3D accelerated drivers have been written to the DRI specification, including drivers for chipsets produced by ATI, Matrox, 3DFX, and Intel.
The DRI was initially developed by Precision Insight, Inc. (PI) in cooperation with, and partially funded by Red Hat Inc., and SGI. Since PI's merger with VA Linux, and VA Linux' subsequent exit from Linux, the DRI is being maintained by Tungsten Graphics Inc., a new company formed by some of the initial DRI developers from PI. Tungsten Graphics is the current focal point for all DRI development, and many open source developers continue to contribute to the project through the DRI sourceforge project.
已经试验证明,不需要安装Mesa就可以完成VTK的安装,只要安装XFree86 Develop Package即可,动态库和头文件分别会被安装到/usr/lib, /usr/X11R6/lib和/usr/include/GL目录下
windows版本的安装需要VC,也就是微软的C++编译器,这里我用的是Visual Studio 2003,因为这个版本对C++标准支持的最好,然后就是去下载VTK的源码和VTKData以及CMake
CMake 的windows版本有个图形界面,其实原理和操作和linux下一样,只是这是图形界面而已,然后就一步步的编译,和linux下的一样,只不过这里的 cmake不生成makefile,而是生成.dsw、.sln这些微软的Visual Studio的项目和工程文件而已。
千万注意:vtk网站提供的windows版本的可执行安装文件不可用!!!这个可执行文件装完后,没有任何的.dll, .lib,只有一堆tcl的文件和库,简言之,不支持C++、JAVA,所以,不可用,必须我们自己手动build!
CMake 的windows版本有个图形界面,其实原理和操作和linux下一样,只是这是图形界面而已,然后就一步步的编译,和linux下的一样,只不过这里的 cmake不生成makefile,而是生成.dsw、.sln这些微软的Visual Studio的项目和工程文件而已。
千万注意:vtk网站提供的windows版本的可执行安装文件不可用!!!这个可执行文件装完后,没有任何的.dll, .lib,只有一堆tcl的文件和库,简言之,不支持C++、JAVA,所以,不可用,必须我们自己手动build!