今天是2013年7月20日,很高兴宣布这篇文章已经完成其历史任务,并在这段时间通过这篇文章和不少同学有了交流。因为官方不光重新在app store上架了新版的VLC,并且官网(http://www.videolan.org/vlc/download-ios.html)也更新至2.0.x。
作者暂时没有时间去研究2.0版本,希望2.0版本以及后续版本一切安好~
上篇文章:《黑苹果,iOS SDK和MobileVLC之逆旅(二) 编译MobileVLC》(http://blog.csdn.net/madongchunqiu/article/details/6707068)发出之后,陆续和不少同学们有些交流。但那毕竟只是我入门iOS平台的学习之作,故不少问题也没能帮到大家。
近来工作有了阶段性成果,可以放松一下,而且手头上面的东西也和自制VLC有那么点沾边,正巧某同学提到iOS SDK5.0上面的编译环境似乎有了不少变化,我的老文章已经无法适应新环境了,所以花了点时间,终于把这个问题搞定了。
半夜三更还在敲键盘,的确有那么点啥。不过我是怕现在不写下来明天起床就忘记了~老了就这样。
下面开始。
一。编译环境:(Development Environment)
硬件平台:MBA
软件系统:Mac OS X Lion 10.7.3
开发环境:Xcode 4.2, iOS SDK 5.0
【注:开发环境不是最新的,是因为我手头的项目在那,怕升级后又要花时间调,想等到项目结尾再升到最新。】
【补注:据称,升级到Xcode4.3和iOS SDK5.1之后,开发环境最大的区别是SDK的目录由
/Developer/Platform/xxx
变成了
/Applications/Xcode.app/Contents/Developer/Platform/xxx
那么对于MobileVLC1.1.0版本而言,首先要做的,就是在源代码中,全局搜索/Developer/Platform/xxx,然后对其进行替换。或者把新目录中的东西再拷贝一份到老目录也行(似乎有些帖子就这么做的),但是考虑到既然Apple下决心换目录了,死抓着老的目录结构也没有必要。】
【补注的注:在bootstrap脚本中,会去查找/Developer/SDKs这个目录,也需要相应的修改】
二。编译的整体说明:(Overview)
总体来说,编译iOS5.0和iOS4.2的区别,在于几个编译器的“名字”变了,比如gcc-4.2和g++-4.2,在新的开发环境目录下都成了llvm-gcc-4.2或llvm-g++-4.2。据称是因为iOS SDK全面放弃使用GNU GCC的缘故。具体原因我也未查找更多资料,不过想来就是因为这些改变,所以才带来了更多的未可知变化。
就细节来说:编译simulator版本的MobileVLC和iOS Target版本的MobileVLC现在不能用同一个脚本了。别问我为什么会这样,我也很迷糊。如下所述
- Simulator版本的更改:
--->1. SDK版本号由3.2升级至5.0 【同iOS SDK4.2的编译修改】
--->2. 编译选项彻底区分simulator版本和iOS target版本【同iOS SDK4.2的编译修改】
--->3. 编译器名称改成:"cpp-4.2 -> llvm-cpp-4.2", "gcc-4.2 ->clang", "g++-4.2 ->llvm-g++-4.2" 【注:这里用llvm-gcc-4.2编译失败后,再改用clang成功的。原因未深究。有人说iOS SDK5.1的Simulator版本编译器目录下没有clang,这点我不甚明了。反正我iOS SDK5.0的Simulator版本编译器目录下是有clang的】
- iOS target版本的更改
--->1. SDK版本号由3.2升级至5.0 【同iOS SDK4.2的编译修改】
--->2. 编译选项彻底区分simulator版本和iOS target版本【同iOS SDK4.2的编译修改】
--->3. 编译器名称改成:"cpp-4.2 -> llvm-cpp-4.2", "gcc-4.2 ->llvm-gcc-4.2", "g++-4.2 -> llvm-g++-4.2" 【注:这里均使用llvm版本的编译器。请比较和Simulator版本的不同,此处使用clang反而会编译错误,原因未深究】
--->4. 链接目录参数加入:-L${IOS_SDK_ROOT}/usr/lib/system
--->5. 更改生成ffmpeg config的makefile,加入--disable-asm参数,原因后面详述
--->6. 为了编译libdvbpsi库,稍稍修改iOS SDK的源文件,在/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/include中拷贝入两个新文件limits.h,原因后面详述。
下面一步步演示如何完成任务。
三。调试版本的修改过程:(Step by step for simulator version)
3.1 将MobileVLC 1.1.0的源代码(http://www.videolan.org/vlc/download-ios.html)下载到本地
3.2 创建目录(比如/VLC),并将3个源代码包解压在目录内,并依次重命名为:MediaLibraryKit, MobileVLC, vlc
3.3 修改MobileVLCKit(即libVLC for iOS)的脚本文件(/VLC/vlc/extras/package/ios/build_for_iOS.sh),因为有几处改动,所以不如直接拷贝我这个版本好了。【注:2处改动,一个是iOS SDK的版本号,一个是编译器的名称】
#!/bin/sh
set -e
echo "Building libvlc for the iOS"
if [ "$1" = "Simulator" ]; then
PLATFORM="Simulator"
TARGET="i686-apple-darwin10"
ARCH="i386"
else
PLATFORM="OS"
TARGET="arm-apple-darwin10"
ARCH="armv7"
OPTIM="-mno-thumb"
fi
THIS_SCRIPT_PATH=`pwd`/$0
pushd `dirname $0`/../../..
VLCROOT=`pwd` # Let's make sure VLCROOT is an absolute path
popd
DEVROOT="/Developer/Platforms/iPhone${PLATFORM}.platform/Developer"
IOS_SDK_ROOT="${DEVROOT}/SDKs/iPhone${PLATFORM}5.0.sdk"
BUILDDIR=${VLCROOT}/build-ios-${PLATFORM}
PREFIX=${VLCROOT}/install-ios-${PLATFORM}
IOS_GAS_PREPROCESSOR="${VLCROOT}/extras/package/ios/resources/gas-preprocessor.pl"
export AR="${DEVROOT}/usr/bin/ar"
export RANLIB="${DEVROOT}/usr/bin/ranlib"
export CFLAGS="-isysroot ${IOS_SDK_ROOT} -arch ${ARCH} -miphoneos-version-min=3.2 ${OPTIM}"
export OBJCFLAGS="${CFLAGS}"
if [ "$PLATFORM" = "Simulator" ]; then
# Use the new ABI on simulator, else we can't build