因项目汇报需要,需演示一个简单的基于OpenSceneGraph的三维科学数据展示平台,但之前该系统在linux(ubuntu和fedora)下运行都没有问题,但现在手头找不到一台装ubuntu的笔记本了,临时和G借了一台,但系统做完后发现其外接视频口是坏的(硬件问题,之前在windows下就无法外接了,估计是主板的问题,或者哪个接口松动了)。
首先想到,能否在虚拟机下完成此工作,在mac下安装免费的virtualbox是没有问题的,因此马上就试验了一下,发现其中二维作图部分都没有问题,但是一旦进入了三维部分,即调用了OpenGL就出现问题,各种不正常。(BTW:在台式机上用同样的虚拟机,可以进行三维演示,主机是UBUNTU系统,估计和显卡驱动有关,air的显卡太烂了)
虚拟机的办法不同,那就看看能否在mac下直接编译三维演示程序,相应的代码都是开源程序的,想当然觉得问题不大,但实际试验下来,发现问题还是挺多的,而且有时候还很麻烦。
1、软件包管理形式尝试
在mac下也有些类似于debian\ubuntu的软件包管理系统,如fink和port,之前二者都有尝试,但整体的感觉和linux下的软件包维护相比,活力要差很多,导致软件库整体偏小,而且有的更新不及时。
而且,在安装OpenSceneGraph时出现编译错误。
2. 二进制包尝试
在OpenSceneGraph官方网站上有for mac的官方二进制包,下载下来后直接解压就可以使用。但我在在编译三维代码时遇到了奇怪的错误:
Undefined symbols for architecture x86_64:
“OpenThreads::Atomic::operator++()”, referenced from:
osg::Referenced::ref() constin ccMX2NbX.o
“OpenThreads::Atomic::operator–()”, referenced from:
osg::Referenced::unref() constin ccMX2NbX.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
搜索了一下,没有找到原因,也没找到解决方法。试验了两个版本:3.0.1和2.8.5,都是同样的问题。
3. 源代码安装
根据这个网址,下载最新的svn代码,然后编译之。
svn checkout http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk OpenSceneGraph-SVN
cd OpenSceneGraph-SVN
cmake -D BUILD_OSG_APPLICATIONS:BOOL=OFF \
-D CMAKE_OSX_ARCHITECTURES:STRING=x86_64 \
-D OSG_WINDOWING_SYSTEM:STRING=Cocoa \
-D OSG_DEFAULT_IMAGE_PLUGIN_FOR_OSX:STRING=imageio \
.
编译的速度好慢,但到了84%的时候,突然跳出个错误,说是找不到jasper头文件,于是用port安装:
sudo port install jasper
然后重新编译,但仍然有同样的错误,好奇怪,但也有比较诡异的解决办法,软链接过去:
sudo ln -s /opt/local/include/jasper /Library/Frameworks/UnixImageIO.framework/Headers/jasper
好了,编译成功,但编译我们的三维代码仍然有之前的问题!再搜索,说是在MAC下有两种编译方法,推荐使用Xcode来编译,好吧,于是再尝试用Xcode来编译:
进入svn目录,建立Xcode目录,然后cmake生成:
mkdir Xcode
cd Xcode
cmake -D BUILD_OSG_APPLICATIONS:BOOL=OFF -D CMAKE_OSX_ARCHITECTURES:STRING=x86_64 -D OSG_WINDOWING_SYSTEM=Cocoa -D OSG_DEFAULT_IMAGE_PLUGIN_FOR_OSX:STRING=imageio -G Xcode ..
进入Xcode后的确可以编译,但编译的结果同上,仍然有问题,再搜,最终在这个地方找到了问题:
在cmake要指定一个参数:
-D OPENTHREADS_ATOMIC_USE_MUTEX:BOOL=ON
果然,加了这个参数就万事大吉了!
BTW: 写代码、管理软件包还是在LINUX下方便啊。
发表回复