編譯步驟
按照https://code.google.com/p/imsdroid/wiki/Building_Doubango的The easy way步驟進行編譯:
- 準備編譯環境:CentOS 7.1虛擬機中安裝libtool、android-ndk等工具(ps:這裏我使用的是當前最新的r10e版本的ndk,而沒有使用上述wiki中使用的r9c版本,這個導致了後面問題的出現);
- 在doubango源碼目錄下依次執行
./autogen.sh
和./android_build.sh gpl
。
編譯出現的問題
./android_build.sh gpl
命令執行到最後提示:
cp: cannot stat ‘/home/xiehui/Work/Project/DOUBANGO/WorkSpace/doubango/android-projects/output/gpl/armv5te/lib/libtinyWRAP.so.0.0.0’: No such file or directory
cp: cannot stat ‘/home/xiehui/Work/Project/DOUBANGO/WorkSpace/doubango/android-projects/output/gpl/armv5te/lib/libplugin_audio_opensles.so.0.0.0’: No such file or directory
cp: cannot stat ‘/home/xiehui/Work/Project/DOUBANGO/WorkSpace/doubango/android-projects/output/gpl/armv7-a/lib/libtinyWRAP.so.0.0.0’: No such file or directory
cp: cannot stat ‘/home/xiehui/Work/Project/DOUBANGO/WorkSpace/doubango/android-projects/output/gpl/armv7-a/lib/libplugin_audio_opensles.so.0.0.0’: No such file or directory
cp: cannot stat ‘/home/xiehui/Work/Project/DOUBANGO/WorkSpace/doubango/android-projects/output/gpl/armv7-a-neon/lib/libtinyWRAP.so.0.0.0’: No such file or directory
最後只成功生成了x86的庫,其他CPU架構的庫沒有成功生成。
問題分析
1.嘗試按照The hard way進行編譯
執行./configure --host=arm-linux-androideabi --with-android-cpu=armv5te --prefix=/tmp/doubango/output/android/armv5te
,報如下錯誤:
checking for arm-linux-androideabi-gcc... /home/xiehui/Work/Project/DOUBANGO/WorkSpace/doubango/my-android-toolchain-armv5te/bin/arm-linux-androideabi-gcc
checking whether the C compiler works... no
configure: error: in `/home/xiehui/Work/Project/DOUBANGO/WorkSpace/doubango':
configure: error: C compiler cannot create executables
查看doubango目錄,沒有my-android-toolchain-armv5te目錄,當然找不到編譯工具了。初步懷疑armv5te等處理器架構的庫沒有生成的原因,就是未生成相應的my-android-toolchain-xxx目錄。
2.爲什麼沒有my-android-toolchain-armv5te
在configure
文件中搜索“my-android-toolchain”,找到如下代碼:
### ANDROID-TOOLCHAIN (http://www.kandroid.org/ndk/docs/STANDALONE-TOOLCHAIN.html)
if test "$target_os" = "android"; then
case "$android_cpu" in
x86)
export SYSROOT=$NDK/platforms/android-9/arch-x86
export ANDROID_PREFIX=i686-linux-android
export ANDROID_TOOLCHAIN=$(pwd)/my-android-toolchain-android-x86
$NDK/build/tools/make-standalone-toolchain.sh --platform=android-9 --arch=x86 --install-dir=$ANDROID_TOOLCHAIN
TARGET_ARCH="x86"
;;
armv7-a)
export ANDROID_PREFIX=arm-linux-androideabi
export SYSROOT=$NDK/platforms/android-3/arch-arm
export ANDROID_TOOLCHAIN=$(pwd)/my-android-toolchain-android-armv7-a
$NDK/build/tools/make-standalone-toolchain.sh --platform=android-3 --install-dir=$ANDROID_TOOLCHAIN
export CFLAGS='-march=armv7-a -mfloat-abi=softfp'
export LDFLAGS='-Wl,--fix-cortex-a8'
TARGET_ARCH="arm"
;;
armv7-a-neon)
export ANDROID_PREFIX=arm-linux-androideabi
export SYSROOT=$NDK/platforms/android-3/arch-arm
export ANDROID_TOOLCHAIN=$(pwd)/my-android-toolchain-android-armv7-a-neon
$NDK/build/tools/make-standalone-toolchain.sh --platform=android-3 --install-dir=$ANDROID_TOOLCHAIN
export CFLAGS='-march=armv7-a -mfloat-abi=softfp -mfpu=neon'
export LDFLAGS='-Wl,--fix-cortex-a8'
TARGET_ARCH="arm"
;;
*)
export ANDROID_PREFIX=arm-linux-androideabi
export SYSROOT=$NDK/platforms/android-3/arch-arm
export ANDROID_TOOLCHAIN=$(pwd)/my-android-toolchain-armv5te
$NDK/build/tools/make-standalone-toolchain.sh --platform=android-3 --install-dir=$ANDROID_TOOLCHAIN
TARGET_ARCH="arm"
;;
esac
其中$NDK/build/tools/make-standalone-toolchain.sh --platform=android-3 --install-dir=$ANDROID_TOOLCHAIN
就是用來生成非x86平臺的編譯工具的。看到這裏,基本能確認問題原因就是這條指令沒有執行成功。單獨運行這條指令,提示Unable to auto-config arch from toolchain
,即不能自動配置(處理器)架構。通過手動添加–arch=arm後,成功生成了相應的編譯工具及目錄。
問題解決方法
執行完./autogen.sh
並生成了configure
文件後,對configure
中的$NDK/build/tools/make-standalone-toolchain.sh --platform=android-3 --install-dir=$ANDROID_TOOLCHAIN
進行修改,添加--arch=arm
,再執行./android_build.sh gpl
。
總結
- 成功編譯後,懷疑r9c版本的ndk可以auto-config arch,對r9c版本的ndk進行測試後發現的確如此,從而肯定了上述問題原因就是r10e版本的ndk不能auto-config arch了(頓時覺得自己有點瓜,不按別人要求的做,非要用最新的工具);
- 其實在最開始執行
./android_build.sh gpl
時,Unable to auto-config arch from toolchain
的錯誤提示也應該是有的,只是因爲提示信息太多,翻頁滾動太快,自己沒有看見。 - 現在還有一點不太明白的是:爲什麼
./android_build.sh gpl
中執行./configure --host=$HOST --with-android-cpu=$arch --prefix=$HOME/$arch --with-pic --enable-nonfree=$ENABLE_NONFREE --enable-gpl=$ENABLE_GPL --enable-debug=$DEBUG $OPTIONS
時,當arch爲armv5te等非x86架構時不報錯終止,而手動執行
./configure --host=arm-linux-androideabi --with-android-cpu=armv5te --prefix=/tmp/doubango/output/android/armv5te
就會報錯終止。