因为实验室的Xeon phi服务器使用的centos 6.4,mitsuba(0.50)的官方帮助文档没有提到centos系统下的源代码编译方式。
因为fedro和centos同源,我们按照官方文档中fedro的教程来安装。下面我写出一些,我在安装过程遇见的困难以及解决问题,整个过程相当的考验你定位、搜索、解决问题的能力,你必须非常的敏锐。
首先,安装依赖项的时会遇见点麻烦:
官方文档中,使用下列命令来安装依赖包:
sudo yum install mercurial gcc-c++ scons boost-devel qt4-devel OpenEXR-devel xerces-c-devel python-devel glew-devel libpng-devel libjpeg-devel collada-dom-devel eigen3-devel fftw3-devel
其中,boost如果使用scons编译时,如果提示找不到boost-thread,boost-system一类的问题时:
你需要使用命令:
#rpm -e boost-devel
#rpm -e boost
来卸载boost和boost-devel,再到boost官网下载source code,安装separately-compiled Boost libraries(动态链接库,系统自带的可能只含有头文件)。boost官方的帮助文档很详细,一步一步的来,不会有问题。
注意:如果你安装的boost是1.58,不知道在boost的哪个版本改动了phoenix模块的位置。原来的boost安装好后,phoenix在/usr/local/include/boost/spirit/home/下。而我安装好boost1.58后,编译mitsuba时出现找不到 /boost/spirit/home/phoenix/bind/bind_member_variable.hpp 的错误。你需要:
#cp /usr/local/include/boost/phoenix /usr/local/include/boost/spirit/home -r
不出意外,在成功编译好mitsuba后,你已然会得到找不到libboost_xx.xxx.so的错误。这是因为我们的boost的库文件安装到了/usr/local/lib下面。
执行:
#cat /etc/ld.so.conf
你会得到这样的信息:
include ld.so.conf.d/*.conf
再执行
#echo "/usr/local/lib" >> /etc/ld.so.conf
#ldconfig
继续,你会发现有一些安装包找不到
glew-devel collada-dom-devel eigen3-devel
这三个安装包使用yum install找不到安装包。
eigen3-devel很简单,到http://eigen.tuxfamily.org/index.php?title=Main_Page下载,按照官方帮助文档一步一步的来就行。编译,复制文件到/usr/local/include/eigen3即可。
glew-devel需要注意,mitsuba用了glewmx,所以,在编译时一定要加入附加编译选项install.all!否则,scons必然会告诉你,找不到-lGLEWMX。
大概过程是这样的,首先下载并解压好glew1.12.0后,
进入glew1.12.0/
#make clean
#make all
#make install.all
最糟糕的是collada-dom-devel,编译和安装过程恶心至极。
首先,你得安装Cg3,这个可以下载到rpm的安装包,直接使用rpm安装即可。
因为mitsuba只用到了minizip和dom,你不需要编译它的domtest,所以:
#vim (path_to_cllada-dom/)dom/make/common.mk
修改
ccFlags= -Wall -DNO_BOOST -DNO_ZAE
保存,退出。
然后依次执行:
#cp Makefile.linux Makefile
#make os=linux project=minizip parser=libxml -C dom
#make os=linux project=dom parser=libxml -C dom
注意,你编译dom的时候,可能会遇见compile error:
src/modules/LIBXMLPlugin/daeLIBXMLPlugin.cpp:457:65: error: ‘zipOpen64’ was not declared in this scope
src/modules/LIBXMLPlugin/daeLIBXMLPlugin.cpp:484:232: error: ‘zipOpenNewFileInZip3_64’ was not declared in this scope
我在这个地址找到了一点提示,http://sourceforge.net/p/collada-dom/bugs/154/
回答问题的人给出关键提示:"minizip-1.1" has the missing symbols for newer-format ZIP files, while "minizip" does not
minizip-1.1中有misssing symbols,而minizip没有。
所以,
#vim dom/make/dom.mk
修改其中的
# minizip
includeOpts += -Iexternal-libs/minizip/include
为
includeOpts += -Iexternal-libs/minizip-1.1 (没有/include)
保存,退出。
再次执行
#make os=linux project=dom parser=libxml -C dom
执行
#make install
OK,所有的依赖项都编译完了。
使用scons 你就能看到:scons: done building targets.
全文完。good luck!