vlc-android 編譯踩坑記
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
在折騰中成長!!