本文来自李明子csdn博客(http://blog.csdn.net/free1985),商业转载请联系博主获得授权,非商业转载请注明出处!
1 原理
MOGRE的托管版主要使用C++/CLI技术,对原来的C++接口做了封装。因此要编译MOGRE,必须生成CLI中间封装代码。
为了在.net环境中,提供统一释放原生资源接口,在OGRE代码中,所有需要导出的类都增加了对CLRObject或者CLRHandle的继承。因此,要能编译OGRE代码,有如下两个工作需要完成:
- 修改OGRE源代码,增加对CLRObject继承或者CLRHandle的继承。如果对象为类且可以派生一般继承CLRObject;如果对象不能派生或者是结构体则派生CLRHandle;
- 基于修改过的代码,创建C++/CLI封装对象的头文件和源文件,然后编译托管版的MOGRE。
2 源码获取
MOGRE相关的资料使用SVN管理,可以使用TortoiseSVN等工具下载MOGRE的源码。目前MOGRE的主要提供两个版本下载:
- 1.4版。这个版本中已经提供了修改过OGRE源码在ogrenew文件夹下。下载地址为:https://mogre.svn.sourceforge.net/svnroot/mogre/branches/1.4 。
- 最新版。下载地址为:https://mogre.svn.sourceforge.net/svnroot/mogre/trunk/Mogre 。
3 编译流程
下面将介绍编译MOGRE的具体流程。如果读者下载的是1.4版,已经有了修改过的Ogre源代码和托管MOGRE的源代码,可以跳过步骤1、2,直接编译ogrenew和Mogre。
3.1 修改OGRE源码
为需要导出的类添加对基类CLRObject或者CLRHandle的继承。在Mogre\Ogre Patches文件夹下,有三个文件CLRObjects.patch、Exception.path和OgreMain_vcproj.patch。patch文件用来表示文件之间的差异信息和修改部分。CLRObjects.patch主要记录了对OGRE中一些主要的类的修改;Exception.patch记录了对异常的修改;OgreMain_vcproj.patch记录了对Ogre工程文件的修改。
3.2 生成MOGRE源码
如果下载的目录Mogre\Mogre\include\auto和Mogre\Mogre\src\auto中已经存在头文件和源码,那么说明MOGRE开发人员已经生成了源码。如果没有,则需要读者使用其提供的工具来生成源码。需要使用的工具分别在 Mogre\cpp2java 和 AutoWrap 文件夹下。 生成步骤如下:
1) 使用cpp2java 文件夹下的doxyxml工具生成ogre代码的一份元数据描述的xml文件。
修改ogre4j.doxygen文件第84行和85行,设置ogre头文件所在的路径。需要注意的是ogre头文件必须是你上一步操作中生成的头文件。下面是一个设置示例:
INPUT = "../ogre/OgreMain/include" \
"../ogre/OgreMain/include/WIN32"
执行build.bat批处理文件。由于Mogre\cpp2java\bin\saxon8_2.jar需要java运行时,因此请确保已经设置JAVA环境变量。执行完成后会在Mogre\cpp2java\build文件夹下生成meta.xml和all.xml两个文件。
2) 打开C#工程Mogre\AutoWrap。它通过元数据文件meta.xml生成托管类。用Visual Studio载入AutoWrap.csproj工程文件,编译工程并运行程序。这个程序的界面非常简单,只有三个按钮:Produce、Include和Cpp。左侧面板中显示将要转换的ogre头文件名称,点击Produce按钮,将生成Mogre的源文件。生成的文件分别输出到Mogre\Mogre\include\auto和Mogre\Mogre\src\auto目录。这个工具存在一些问题,比如生成的文件不全等等。
3.3 编译代码
需要先后编译OGRE和MOGRE的源码:
- 编译OGRE。OGRE源码需要编译两次。第一次编译时,保证CLRConfig.h文件中的宏定义#define LINK_TO_MOGRE 0。编译完成后,修改LINK_TO_MOGRE宏为1,再次编译。注意此时不要选择Rebuild,而要选择build,否则会编译出错。编译OGRE的时间比较长,可能长达10分钟。
- 编译MOGRE。这里没有什么需要设置的,直接编译即可。
4 参考资料
http://www.ogre3d.org/wiki/index.php/Building_MOGRE_from_source