SDL中文论坛

标题: 编译libvpx [打印本页]

作者: ancientcc    时间: 2017-2-26 09:27
标题: 编译libvpx
本帖最后由 ancientcc 于 2017-2-26 09:58 编辑

libvpx源码树中的README有说如何编译,但那里写的可能有点简单,这里作补充。为能让进入断点,至少Windows是要支持Visual Studio编译。

不管哪平台,编译libvpx需两部分文件,一部分从直接下载的源码包中就能得到,另一部分需要用configure生成。configure生成的又分若干汇编文件和7个头文件。头文件分别是vp8_rtcd.h、vp9_rtcd.h、vpx_config.asm、vpx_config.c、vpx_config.h、vpx_dsp_rtcd.h和vpx_scale_rtcd.h,其中vpx_config.c是以下内容。
  1. #include "vpx/vpx_codec.h"
  2. static const char* const cfg = "--target=armv7-android-gcc --sdk-path=../../../../../../android-ndk-r13b --extra-cflags=-mfloat-abi=softfp -mfpu=neon --disable-runtime-cpu-detect --disable-pic --disable-realtime-only";
  3. const char *vpx_codec_build_config(void) {return cfg;}
复制代码
cfg变量存储了在执行configure命令行时使用的参数。

为此要实现各平台在IDE下编译,终归是要解决两个问题:1)如何得到configure生成的文件,2)如何知道要编译哪些源文件。

在libvpx源码树中增加了“build-leagor”目录,那里有我写的针对Windows、Android和iOS三个调用configure的脚本。

Windows
要编译Windows版本,须要安装yasm,用它去汇编当中的汇编代码,yasm官网:http://yasm.tortall.net/。一种较简单的安装方法是下载yasm.exe,然后把它复制到一个已经在的PATH路径,或就是Visual Studio的bin路径,类似C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin。

如何生成若干汇编文件和7个头文件?

有了vpx.sln,就可看到libvpx需要编译哪些源文件,接下就可制作自已的sln了。build-win-ia32.sh出来的结果是32位,以下是编译Visual Studio 2015的x64平台。
  1. $ mkdir build
  2. $ cd build
  3. $ ../libvpx/configure --target=x86_64-win64-vs14
  4. $ make
复制代码

x86(win32)的*.exe不能使用x64(win64)编译出的*.lib,x64(win64)的*.exe不能使用x86(win32)编译出的*.lib。也就是说,当你要编译x86的exe,那你需要编译--target=x86-win32-vs14的libvpx,x64时是--target=x86_64-win64-vs14。

在Visual Studio 2015,需修改编译asm时的命令行,让输出文件主名件文是输入的主文件名。举个例子,要编译add_noise_sse2.asm,官方是这么写的。
  1. yasm -Xvc -g cv8 -f win64  -I"." -I"C:/ddksample/mywebrtc/libvpx-1.6.0" "%(FullPath)" -o $(IntDir)vpx_dsp_x86_add_noise_sse2_asm.obj
复制代码

要改为
  1. yasm -Xvc -g cv8 -f win64  -I"." -I"C:/ddksample/mywebrtc/libvpx-1.6.0" "%(FullPath)" -o $(IntDir)add_noise_sse2.obj
复制代码

如果不修改,链接时会找不到*.asm实现的那些函数。

iOS
为什么没有xcode版的iOS包?要发布iOS下的通用包,那它需同时支持多种cpu架构,像armv7、armv7s、arm64。但是,在不同架构下,组成libvpx的源码有不同,举个例子,armv7架构需要编译数个汇编文件,而arm64不需要,xcode很难调和这种情况。

那如何生成iOS下的通用包?1)按官方写的方法生成各种架构下的libvpx.a,2)执行lipo把这些个.a生成通用libvpx.a。以下脚本显示了这个过程,它已被写成build-ios.sh。
  1. cd ..
  2. mkdir build-ios-armv7
  3. cd build-ios-armv7
  4. ../configure --target=armv7-darwin-gcc
  5. make

  6. cd ..
  7. mkdir build-ios-armv7s
  8. cd build-ios-armv7s
  9. ../configure --target=armv7s-darwin-gcc
  10. make

  11. cd ..
  12. mkdir build-ios-arm64
  13. cd build-ios-arm64
  14. ../configure --target=arm64-darwin-gcc
  15. make

  16. cd ..
  17. lipo -create build-ios-arm64/libvpx.a build-ios-armv7/libvpx.a  build-ios-armv7s/libvpx.a -output build-leagor/libvpx.a
复制代码

用这种方法生成的libvpx.a很难使用断点,如果希望用断点进入libvpx内部,那建议使用Windows平台,即Visual Studio。

Android
如何生成若干汇编文件和7个头文件?以下是用Mac OS X编译Android平台的libvpx。

通过以上生成的文件,就可写出自个的Android.mk。于是为避免还要下载Mac OS X的NDK工具链,Rose提供了简单的Windows命令行编译。
  1. cd %libvpx%
  2. %NDK%/ndk-build
复制代码

要确认编译是否成功,可以察看<SDL>/libvpx/projectfiles/android/libs/armeabi-v7a下是否生成了一个新的libvpx.so文件。

注:Webrtc自提供的libvpx没有给出Android平台,但可用当中的linux。




欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/) Powered by Discuz! X3.3