VLC-Android编译踩过的坑及感悟,整理发表出来,希望对大家有帮助。
一、建议掌握的基本知识【否则在编译过程中,连错误都不知道怎么查,如下一些基本点是针对linux小白的,大牛勿喷】
a. Makefile的工作原理,明白Rule-Target-Prerequisites-Recipe的关系,能自己写一些简单的Makefile
b.autotools工具集的工作原理,因为vlc的编译依赖几十个库,这些库的编译都是基于autotools工具集,明白configure.ac, Makefile.am
的原理,能看懂且能修改; libtoolize, autoreconf命令的使用及工作过程【aclocal, libtoolize, autoconf,autoheader,automake】
, 看懂Makefile文件之间的调用依赖会帮助你更清晰理解整个编译的过程
c. 基本的编译命令及gcc编译过程,预处理【E】-编译【c】-汇编【S】-连接【o】
d.基本的linux命令,find、grep等要经常用到,在修改源码的时候用到
二、编译前注意的点
a. 如果用虚拟机如vmware workstation来编译的,尤其要注意尽量把源码放在虚拟机的目录里,而不要放在共享文件夹下【vmware可以和windwos通过共享文件来来交互,所以笔者曾经把ffmpeg的代码解压到了共享文件夹里,结果在编译时死活报library.mk有错,可一看它的规则都没有问题,后来查明是换行符在windows和linux下不同导致,如果直接解压在linux目录下则无问题】
b. vlc-android编译的关键是vlc中的contrib组件编译,这里一定要保证vlc的版本是正确的,要跟compile-libvlc.sh保持一致,笔者曾经因为vlc的git代码下载不下来,就随便找了一个版本的源码放在vlc-android下,结果编译到最后,发现一堆错误,欲哭无泪;只好老老实实按compile-libvlc.sh中的hash值找到相应的代码下载下来,编译才正常;这里分享一个技巧,当发现vlc的代码下载不下来,尤其是比较早的版本时,可以先通过GitHubDesktop把master版本下载下来,再git checkout hash值,把指定的版本下载下来,尤其是早期的ffmpeg版本,用git clone很难下载下来,通常是下载到30%多就卡着不动了,用GitHubDesktop下载就很快;
三、本次编译的环境
a. 操作系统 Ubuntu14.04 VmwareWorkstation中装的
b. vlc-android版本:2.16
c. NDK版本: r13b
四、遇到的问题及解决方案记录
a.
libtoolize: Remember to add `LT_INIT' to configure.in.
libtoolize: Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.in and
libtoolize: rerunning libtoolize, to keep the correct libtool macros in-tree.
libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am.
解决办法 :照提示修改,在configure.ac 中添加LT_INIT Makefile.am中添加AC_CONFIG_MACRO_DIR([m4])
b.
./configure: line 13231: syntax error near unexpected token `FREETYPE,'
./configure: line 13231: `PKG_CHECK_MODULES([FREETYPE], freetype2 >= 9.10.3,'
解决办法 /usr/share/aclocal/pkg.m4 移入m4 然后执行autoreconf
c.
configure.in:74: error: possibly undefined macro: AC_DISABLE_SHARED
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
configure.in:75: error: possibly undefined macro: AC_LIBTOOL_WIN32_DLL
configure.in:76: error: possibly undefined macro: AC_PROG_LIBTOOL
解决办法:
Fixed by inserting these into compile.ac
m4_pattern_allow([^AM_])
m4_pattern_allow([^AC_])
m4_pattern_allow([^AS_])
d.
error: Libtool library used but 'LIBTOOL' is undefined
解决办法:在configure.ac 中添加LT_INIT Makefile.am中添加AC_CONFIG_MACRO_DIR([m4]) 拷贝libtool.m4 到工程m4目录下,然后执行libtoolize aclocal autoreconf
e.
ffmpeg ERROR: libopenjpeg1 not found 找到libopenjpeg1.pc 拷贝到vlc/contrib/arm-linux-androideaib/lib/pkg-config 下
在libs 后加入-lm
f.
configure: error: cannot find install-sh or install.sh in . ./.. ./../.. 错误:
在源码目录下执行 autoreconf -f -i -Wall,no-obsolete
g .如果一个库已经编译过就不想编译就在contrib/src/contrib-arm-linux-androideabi 创建.库名,比如x265不想编译,就在contrib/src/contrib-arm-linux-androideabi下创建.x265
h.
提示gettext版本不够高,就去configure.ac 中把要求的GETTEXT版本改低即可
四、编译
在编译过程中会通过vlc/contrib/src/main.mk去下载各个版本的库,最好提前下载好,如果下载失败,可以直接去vlc官网上去下载,强烈推荐在http://download.videolan.org/pub/contrib/这个上面去下载,几乎你要的都有,不用去网上找。感觉我踩的坑已经够多了,如果上面的坑都踩过了,基本上半个多小时就编译过了。
附上编译的版本:
https://download.csdn.net/download/u012532305/10755413
在折腾中成长!!