前言:
3D游戏架构课上,老师以OGRE为例让我们剖析一个游戏引擎的架构,我是不喜欢但看源码的,所以就花了一整天在Mac上编译了OGRE的1.10版本
于此之前并没有用过OGRE,只用过Unity3D等
OGRE给人一种比较小,比较老的感觉,网上关于编译的教程也是风貌麟角,过程中遇到许多奇奇怪怪的问题,总的来说,是一个费力不讨好的过程。
搞到半夜两三点,已记不清看到多少次红字经历了多少次失败
即便如此,在改了许多小error,最后终于看到Xcode的Build Success标志的时候,还是按耐不住内心的激动
一、搭建环境
- 系统: OS X 10.13.3 High Sierra
- OGRE: 1.10
- Cmake:
- Xcode: 9.2 (9C40b)
- HG: 4.5.3
HG也可以用Git来替代,github上边有ogre依赖项的镜像克隆(以下会讲到)
二、搭建步骤
1. 工具下载安装
Homebrew
这是一个Mac上用于管理软件包的工具,类是Linux下的apt-get,命令也差不多
可以直接上homebrew官网复制命令到terminal运行:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Hg
版本控制管理器,也可以用git替代:brew install hg
Cmake
brew cask install cmake
可以安装cmake的GUI版本,方便后边操作
BTW,
于Homebrew,有两种安装方法:
- 一种是下载源码并且帮你默认编译安装到/usr/local,命令为
- brew install “softwarename”
- 另外一种是直接下载release版本,大概流程是像下dmg并且给你安装到application目录下,其命令为在install前面加个cask,即
- brew cask install “softwarename”
2. ogre及其依赖项(Ogredeps)下载
Ogre
到Ogre官网下载source源码:https://www.ogre3d.org/download/sdk
这里下的是OGRE 1.10.11版本:https://github.com/OGRECave/ogre/archive/v1.10.11.zip
当然你也可以到github上边选择特定分支clone
Ogredeps
这是ogre的prerequisites,地址为:https://bitbucket.org/cabalistic/ogredeps
用hg下载,使用方法跟git基本一致hg clone https://bitbucket.org/cabalistic/ogredeps
依赖库放到ogre源代码的根目录下,跟OGREMain同级。
- 直到此时,目录应该为:
3. 编译Ogredeps
在目录/ogre/ogredeps下面新建build文件夹,用于存放cmake结果
- 打开cmake
- 选择sourcecode为ogredeps
- destination为ogredeps/build,如下图
- 之后点击configure选择编译工具为xcode
- configure之后如果出现红色的项则要逐一排除错误,没有错误可以skip掉下边环节
小插曲——本地出现的错误
错误一 Xcode路径不对
错误代码:
xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
之前没有试过用cmake编译成xcode工程文件,所以会出现这个错误解决方法:在Terminal中输入命令:(注意更改路径)
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
错误二 提示scr/Remotery.mm文件资源找不到
我也不知道为什么一个开源项目会有这种错误,难道别人编译没问题?
找了下,是在目录ogredeps/src/Remotery/src下的四个文件:看了下该目录下的cmakelist.txt文件,发现其路径设置为Remotery.mm,无语。。。
这是objective c和c混编的东西,直接把RemoteryMetal.mm重命名为Remotery.mm就可以错误三 Policy CMP0042 is not set: MACOSX_RPATH is enabled by default
这是个Mac下cmake常见错误,在ogredeps根目录下边的CmakeList.txt加入下面这个命令就可以了:
set(CMAKE_MACOSX_RPATH 1)
继续编译ogredeps
configure没问题了之后,点击generate生产项目文件,然后打开OGREDEPS.xcodeproj
- 两个步骤安装,选择编译方式并点击build
- 首先选择ALL_BUILD编译一次
- 然后选择install编译一次
错误四
然后匪夷所思的错误又来了,编译失败了
出现在Remotery模块下的 Remotery.c和Remotery.mm的链接错误,大概就是找不到函数了。简单看了下,这是个objective-c和c的混编,两边调函数,objective-c中又将其内容封装成c函数接口供c代码调用
- 错误出现在以下两个函数
- rmtMetal_MeasureCommandBuffer
- rmtMetal_usGetTime
解决方法:
- 在Remotery.mm
- 36行的rmtMetal_usGetTime函数原型前面加 extern “C” 字符
- 42行的rmtMetal_MeasureCommandBuffer函数原型前面同样加 extern “C”字符
原因:
- 参考自http://www.clarkcox.com/blog/2009/02/07/link-errors-when-mixing-c-with-cobjective-c/
- 这是在oc跟c++和c混合编译时常见的链接错误
- 因为汇编里面c和c++函数对应的函数名字发生的变化不同,c一般只是在函数名称前面加下划线,而c++由于重载等原因变得比较复杂。
- 比如在c中,函数原型为int Foo(int i, float f)的只是变成_Foo,
- 而同样的东西在c++里面会变成__Z3fooif,分别蕴含了函数名字个数,参数类型等
- So,
- 因为c的函数被解读成了c++函数,在编译的时候就会发生找不到函数的链接错误
- extern “C”用于显式表明这是个C函数,加上即可
4. 编译Ogre
和编译ogredeps方式大致相同
- 同样用cmake选择sourcecode为ogre根目录
- 在ogre根目录新建build文件夹
- 选择destination为build文件夹
- 点击configure之后发现有红色选项,不过这不是错误,找到其中的OGRE_DEPENDENCIES_DIR, 把它的值设置成 /ogre/ogredeps/build/ogredeps,再点击Configure, 会看到顺利完成,然后点击generate。 这样编译完成后,打开 /ogre/build目录,会看到如下结果
- 打开OGRE.xcodeproj
- 跟上边一样,选择编译方式,然后build
- 首先是ALL_BUILD
- 再是Install
- 最后时SampleBrowser
三、完成搭建
如果顺利编译完成的话,我们在/ogre/build/bin/debug下面就可以看到SampleBrowser的可执行文件了,打开就可以浏览了。同样你也可以编译出Release版,在Xcode的scheme中将debug改成release再编译一次即可。 如图所示:
四、其他错误参考
Mac下面ogre的prerequisites,少哪补哪
http://wiki.ogre3d.org/Prerequisites?tikiversion=Mac+OS+X+%26+iOS