Zejun Lin's Blog

异国漂泊,野蛮生长

0%

在Mac OS上用Xcode编译OGRE

sample.png-288.6kB

前言:

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同级。

  • 直到此时,目录应该为:
    image_1cakrm1pear5j6j1o8ikjfopm.png-114.4kB

3. 编译Ogredeps

在目录/ogre/ogredeps下面新建build文件夹,用于存放cmake结果

  • 打开cmake
  • 选择sourcecode为ogredeps
  • destination为ogredeps/build,如下图
    cmake1.png-80.4kB
  • 之后点击configure选择编译工具为xcode
    image_1caksf33ufq55m91ke5jao11c51s.png-35.3kB
  • 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下的四个文件:
image_1caksm69g6ds1erfc9k13v916d748.png-41.5kB

看了下该目录下的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

ogredeps.png-82.2kB

  • 两个步骤安装,选择编译方式并点击build
    1. 首先选择ALL_BUILD编译一次
    2. 然后选择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”字符
      xcode-erro.png-230.8kB

原因:

  • 参考自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文件夹

image_1cakuo5908gr4v5cu71tb8dqs5d.png-36.8kB

  • 点击configure之后发现有红色选项,不过这不是错误,找到其中的OGRE_DEPENDENCIES_DIR, 把它的值设置成 /ogre/ogredeps/build/ogredeps,再点击Configure, 会看到顺利完成,然后点击generate。 这样编译完成后,打开 /ogre/build目录,会看到如下结果

image_1cakus419tqv1cqh16gj15rv1v7k6a.png-144.2kB

  • 打开OGRE.xcodeproj

image_1cakuunrjccb11jj12roa7rp1o6n.png-69.6kB

  • 跟上边一样,选择编译方式,然后build
    • 首先是ALL_BUILD
    • 再是Install
    • 最后时SampleBrowser

三、完成搭建

如果顺利编译完成的话,我们在/ogre/build/bin/debug下面就可以看到SampleBrowser的可执行文件了,打开就可以浏览了。同样你也可以编译出Release版,在Xcode的scheme中将debug改成release再编译一次即可。 如图所示:

sample.png-288.6kB

四、其他错误参考

Mac下面ogre的prerequisites,少哪补哪
http://wiki.ogre3d.org/Prerequisites?tikiversion=Mac+OS+X+%26+iOS