今天是2013年7月20日,很高兴宣布这篇文章已经完成其历史任务,并在这段时间通过这篇文章和不少同学有了交流。因为官方不光重新在app store上架了新版的VLC,并且官网(http://www.videolan.org/vlc/download-ios.html)也更新至2.0.x。
作者暂时没有时间去研究2.0版本,希望2.0版本以及后续版本一切安好~
补注:
本文开发环境是xcode3.2.5 / iOS SDK4.2 / Snow Leopard 10.6.4
若寻找开发环境为xcode4.2 / iOS SDK5.0 / Lion 10.7.3,请移步:基于iOS5.0的MobileVLC(vlc for iOS)编译 -- 含FFMpeg库的编译解决办法)
一. 需求 (Requirement)
出于学习的目的,试图编译一个基于iOS SDK 4.2的MobileVLC成熟版本,最终定位在MobileVLC 1.1.0 ,因为官方的网站提供了全套软件源代码包下载。
二. 环境 (Environment)
1. CPU: E7300, 显卡:ATI4850
2. 安装黑苹果:Snow Leopard 10.6.3,然后升级到10.6.8
3. 安装开发环境:Xcode 3.2.5 and iOS SDK 4.2 for Snow Leopard (10.6.4)
三. 步骤 (Step by step to build MobileVLC-1.1.0)
1. 将MobileVLC 1.1.0的源代码(http://www.videolan.org/vlc/download-ios.html)下载到本地
2. 创建目录(比如/VLC),并将源代码解压在目录内,并重新命名为:vlc, MediaLibraryKit, MobileVLC
3. 修改MobileVLCKit(即libVLC for iOS)的脚本文件(/VLC/vlc/extras/package/ios/build_for_iOS.sh),将
IOS_SDK_ROOT="${DEVROOT}/SDKs/iPhone${PLATFORM}3.2.sdk" |
改成
IOS_SDK_ROOT="${DEVROOT}/SDKs/iPhone${PLATFORM}4.2.sdk"
|
4. 修改总脚本(/VLC/MobileVLC/buildMobileVLC.sh),将其由如下代码,整体进行替换:
#!/bin/bash
git clone ssh://[email protected]/var/git/vlc.git
git clone ssh://[email protected]/var/git/MediaLibraryKit.git
git clone ssh://[email protected]/var/git/MobileVLC.git
pushd vlc
pushd extras/package/ios
./build_for_iOS.sh
popd
pushd projects/macosx/framework
xcodebuild -project MobileVLCKit.xcodeproj -target "Aggregate static plugins" -configuration "Release"
xcodebuild -project MobileVLCKit.xcodeproj -target "MobileVLCKit" -configuration "Release"
popd
popd
pushd MediaLibraryKit
ln -s ../../vlc/projects/macosx/framework/build/Release-iphoneos External/MobileVLCKit
xcodebuild -project MobileMediaLibraryKit.xcodeproj -configuration "Release"
popd
pushd MobileVLC
ln -s ../../vlc/projects/macosx/framework/build/Release-iphoneos External/MobileVLCKit
ln -s ../../MediaLibraryKit/build/Release-iphoneos External/MediaLibraryKit
popd
|
替换成:
#!/bin/bash
rm -rf ./MediaLibraryKit/External/MobileVLCKit
rm -rf ./MobileVLC/External/MobileVLCKit
rm -rf ./MobileVLC/External/MediaLibraryKit
if [ "$1" = "Simulator" ]; then
pushd vlc
echo "--==-- Build for vlc (simulator version) --==--"
pushd extras/package/ios
./build_for_iOS.sh Simulator
popd
echo "--==-- Build for vlc-MobileVLCKit (simulator version) --==--"
pushd projects/macosx/framework
xcodebuild -project MobileVLCKit.xcodeproj -target "Aggregate static plugins" -configuration "Release" -sdk iphonesimulator4.2 SDKROOT=iphonesimulator4.2 VALID_ARCHS=i386 ARCHS=i386
xcodebuild -project MobileVLCKit.xcodeproj -target "MobileVLCKit" -configuration "Release" -sdk iphonesimulator4.2 SDKROOT=iphonesimulator4.2 VALID_ARCHS=i386 ARCHS=i386
popd
popd
echo "--==-- Build for MediaLibraryKit (simulator version) --==--"
pushd MediaLibraryKit
ln -s ../../vlc/projects/macosx/framework/build/Release-iphonesimulator External/MobileVLCKit
xcodebuild -project MobileMediaLibraryKit.xcodeproj -configuration "Release" -sdk iphonesimulator4.2 SDKROOT=iphonesimulator4.2 VALID_ARCHS=i386 ARCHS=i386
popd
echo "--==-- Build for MobileVLC (simulator version) --==--"
pushd MobileVLC
ln -s ../../vlc/projects/macosx/framework/build/Release-iphonesimulator External/MobileVLCKit
ln -s ../../MediaLibraryKit/build/Release-iphonesimulator External/MediaLibraryKit
xcodebuild -project MobileVLC.xcodeproj -configuration "Release" -sdk iphonesimulator4.2 SDKROOT=iphonesimulator4.2 VALID_ARCHS=i386 ARCHS=i386
popd
else
pushd vlc
echo "--==-- Build for vlc (os version) --==--"
pushd extras/package/ios
./build_for_iOS.sh
popd
echo "--==-- Build for vlc-MobileVLCKit (os version) --==--"
pushd projects/macosx/framework
xcodebuild -project MobileVLCKit.xcodeproj -target "Aggregate static plugins" -configuration "Release" -sdk iphoneos4.2 SDKROOT=iphoneos4.2 VALID_ARCHS=armv7 ARCHS=armv7
xcodebuild -project MobileVLCKit.xcodeproj -target "MobileVLCKit" -configuration "Release" -sdk iphoneos4.2 SDKROOT=iphoneos4.2 VALID_ARCHS=armv7 ARCHS=armv7
popd
popd
echo "--==-- Build for MediaLibraryKit (os version) --==--"
pushd MediaLibraryKit
ln -s ../../vlc/projects/macosx/framework/build/Release-iphoneos External/MobileVLCKit
xcodebuild -project MobileMediaLibraryKit.xcodeproj -configuration "Release" -sdk iphoneos4.2 SDKROOT=iphoneos4.2 VALID_ARCHS=armv7 ARCHS=armv7
popd
echo "--==-- Build for MobileVLC (os version) --==--"
pushd MobileVLC
ln -s ../../vlc/projects/macosx/framework/build/Release-iphoneos External/MobileVLCKit
ln -s ../../MediaLibraryKit/build/Release-iphoneos External/MediaLibraryKit
xcodebuild -project MobileVLC.xcodeproj -configuration "Release" -sdk iphoneos4.2 SDKROOT=iphoneos4.2 VALID_ARCHS=armv7 ARCHS=armv7
popd
fi
|
5. 运行脚本进行编译,如果编译Simulator版本,则使用:
cd /VLC
./MobileVLC/buildMobileVLC.sh Simulator |
如果编译iOS版本,则:
cd /VLC
./MobileVLC/buildMobileVLC.sh |
6. 多运行2遍保证各个编译命令都是"Build SUCCEEDED"。(ffmpeg库在patching时会出错,导致第一次编译libVLC出错,但是再次编译可以通过。具体影响待查,因为本篇仅考虑编译问题。)
四. 查错 (TroubleShooting)
1. 总体说来,在MobileVLC 1.1.0版本里,开发团队对文档和脚本的忽略程度都是令人发指的。怎么说呢,别不把写脚本当编程啊!我对脚本的改进主要在这几个方面:
a) 删掉了git相关的语句,因为是直接编译下载的1.1.0版本源代码,不需要新代码
b) 从参数上彻底区分了Simulator版本和iOS版本,而原脚本只是编译一个iOS版本,且参数设定还不够详尽。(出发点是因为我用的是黑苹果,而且暂时没有破解那个99刀的开发证书。)
c) 在xcodebuild后面加了详尽的参数,这样不用依赖于项目文件(*.xcodeproj)里面的默认参数了。指定的参数设置,会明确具体的编译环境和目标目录,减少出错的可能性。
2. 编译中会出现很多莫名其妙的错误,如:
a) 出现如下错误:
[PBX????] ???????????????? error
|
具体错误提示没有记录下来,大概是这样子。得到网上的提示,重装Xcode 3.2.5 and iOS SDK 4.2即可。(很奇怪不是吗?...)
b) 出现如下错误:
patching file live/liveMedia/RTSPClient.cpp
Hunk #1 FAILED at 136.
1 out of 1 hunk FAILED -- saving rejects to file xxx
make [1]: *** [live] Error 1
|
这个错误在这里似乎有提到:http://luuvish.org/208,但又不同(韩文,用了google translate还是无法全懂...)。我现在没有理这个错误,直接重新编译一次,可以通过。但是还不确定对程序运行时的影响如何。
c) 出现如下错误:
file was built for unsupported file format which is not the architecture being linked (armv7)
Undefined symbols:
"_OBJC_CLASS_$_VLCMediaPlayer", referenced from:
objc-class-ref-to-VLCMediaPlayer in MVLCMovieViewController.o
|
这个错误在这里有提到:http://rick-hawkins.blogspot.com/2010/11/compiling-vlc-in-xcode-for-ipad.html,作者说重新编译一次即可。我觉得是库和最终的执行文件的目标结构不统一造成的(arm or i386)。使用我新编的脚本,统一目标结构,应该就不存在这个问题了。
五. 啰嗦 (More)
出于机器能力的考虑,我是装了Snow Leopard 10.6.3,然后升级到10.6.8的,就是为了能装iOS SDK 4.2。
不考虑使用更加新版的iOS SDK,主要是因为我是首次学习使用,觉得4.2版本会久经考验稳定一些,即使出现问题,网上查找解决方案应该也会容易一些。
使用iOS SDK 4.2编译最新版本的MobileVLC,即git下载源代码并编译http://wiki.videolan.org/MobileVLC,出现了不少错误,网上查找原因也未果。因此才转头来下载了已经被很多人证明是可以用iOS SDK 4.2编译的MobileVLC 1.1.0版本。真希望VLC的开发小组能对每个稳定的版本都打个包以供下载(或者在git里面打label也行http://git.videolan.org/?p=MobileVLC.git;a=summary),然后提示一下推荐的iOS SDK版本,这样对新手而言,学习曲线就不会那么陡了。
结果也证明,即使很多人都用iOS SDK 4.2成功编译了MobileVLC,但是官网提供的下载里面的错误仍然是很多的。这种错误对于有经验的开发人员而言,可能是分分钟的问题,但是对新手而言,则变成了没日没夜的debug和网上资料搜索。而造成这种现象的原因,我觉得与MobileVLC的开发团队对Script和Document几乎完全不重视相当有关。
六. xcode图形界面编译 (xcode GUI)
脚本中使用xcodebuild命令的地方,都可以用图形界面编译,只需要
1. 如下图设置项目参数 (右键点击项目名,选择Get Info。如果编译Simulator版本,则需要增加i386选项的支持。如果编译iOS版本,则有arm选项即可)
2. 如下图设置输出目标选项 (主窗体左上角下拉菜单里。如何和下图不一致,可以来回选择最上面的Device和Simulator选项,让软件进行修正)
3. 在左侧窗口里,展开Target项,然后右键点击在编译目标上,选择"Build xxx"
PS: 估计MacOS的显卡驱动还是有问题,所以系统内截图失败。所幸ipad2的镜头虽烂,总还是可以看清楚的。
七. 给读者的话 (Tips)
近来越来越多的收到读者来信,让我帮忙看看编译log找出问题。我把这些问题总结后发在下面的文章中了。如果你也在编译中有所苦恼的话,请看这里:
编译MobileVLC时,可能会用到的一些编译调试技巧集合(Mac)(http://blog.csdn.net/madongchunqiu/article/details/7931267)
八. 参考 (References)
http://luuvish.org/208
http://rick-hawkins.blogspot.com/2010/11/compiling-vlc-in-xcode-for-ipad.html
http://forum.videolan.org/viewforum.php?f=12
其实写这文的主要目的是因为在学习的过程中得到了很多网络上文章的帮助,心生感激。因此把困扰了自己的问题一一列举在此,希望对遇到同样问题的人能有所帮助。
This article is written in special thanks to the blog writters who offered me clues to solve the issues during the MobileVLC-1.1.0 compilation.
九。其它 (More)
我今天(2012-12-03)才发现原来CSDN里多了好些"私信",以前都没注意到有这个功能,所以都没有查看,更遑论回复,还请见谅。不过请不要再给我发"私信"了,因为要登录查看,感觉特麻烦,我一般是不会去查看的。有问题还请直接在文章后面留言,或者发邮件到我的信箱:[email protected],这两者都有消息推送,我即使不登录CSDN也可以收到的,方便很多。