本文发自 http://www.binss.me/blog/use-xcode-to-bulid-webrtc-demo/,转载请注明出处。

《生成WebRTC的DEMO并运行》中,我们已经按照官方的指导,用ninja生成了AppRTCDemo.app并成功运行。

用ninja生成虽然又快又好,但是问题一是编译过程极其不透明,执行ninja -C out_mac/Debug AppRTCDemo后就从[0/2000+]跑到[2000+/2000+]然后编译完成生成app文件;二是每次生成都要重新把库生成一遍(这个过程CPU占用率100%温度90+持续2~3分钟),每次都感觉电脑要爆炸。三是以改代码的方式来学习和调试非常不方便。

于是我想,能否用xcode来编译?

打开了trunk目录下的all.xcodeproj,在里面的libjingle_examples里面竟然找不到AppRTCDemo,在其编译生成的文件夹里面也找不到AppRTCDemo.app。郁闷一番后弃坑做其他事去了。直到昨天晚上想起,才开始GOOGLE,这才对AppRTCDemo.app的生成机制有了一点了解。

我们知道,执行了ninja -C out_mac/Debug AppRTCDemo后就生成了AppRTCDemo.app。

那么什么是ninja?

Ninja is a small build system with a focus on speed. It differs from other build systems in two major respects: it is designed to have its input files generated by a higher-level build system, and it is designed to run builds as fast as possible.

也就是说利用ninja作为编译工具,我们编译出了AppRTCDemo.app。

ninja默认的编译规则文件(工程文件)是build.ninja,我们也在相同目录下找到了它,那么它是什么时候生成的呢?

尝试发现,在官方教程中,我们之前先执行了以下命令,生成了out_mac文件夹,其中就有build.ninja。

export GYP_DEFINES="build_with_libjingle=1 build_with_chromium=0 libjingle_objc=1"
export GYP_GENERATORS="ninja"
export GYP_DEFINES="$GYP_DEFINES OS=mac target_arch=x64"
export GYP_GENERATOR_FLAGS="$GYP_GENERATOR_FLAGS output_dir=out_mac"
gclient runhooks

很明显前4行都是在配置环境,然后最后一行生成了build.ninja。

网上对gclient runhooks的说明是:调用GYP工具生成平台相关的文件。

而这个文件,就是工程文件。

export GYP_GENERATORS="ninja"改为export GYP_GENERATORS="xcode"再执行gclient runhooks。从修改日期上看到,果然重新生成了all.xcodeproj。打开all.xcodeproj,终于见到了AppRTCDemo。

做到这里,非常高兴地command+R然后就去上课。结果回来发现报了一堆的链接错误:

GOOGLE搜索webrtc+linker error发现没有类似的问题...... GOOGLE上linker error倒是结果很多,按着做了之后还是没能解决。

看来只好自己研究。同样的代码,为嘛ninja就可以成功编译而xcode却不能?我把ninja生成的库覆盖了xcode生成的库后编译仍然是相同的错误。这些错误有个共同点都是:

std::string:xxxxx,referenced from:xxxxxxxxx

难道是缺c++标准库而导致引用失败?

查看AppRTCDemo的Linked Frameworks and libraries,发现果然没有!

果断导入libstdc++:

P.S 以上是浪费了几小时生命后的结果。

command+R后终于成功了!CRY......

从此之后终于可以直接在xcode下改代码后一键编译啦!