1. 程式人生 > >vlc-android 編譯踩坑記

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

在折騰中成長!!