32位Ubuntu編譯android常見錯誤
原文:
連結
開始正式編譯,在原始碼目錄下make即可。
make
我完全不知道跑了個啥,只知道超級卡。完成後產生的out資料夾有3.9G。
映象生成在out/target/product/generic下:android原始碼編譯後得到system.img,ramdisk.img,userdata.img映像檔案。其中, ramdisk.img是emulator的檔案系統,system.img包括了主要的包、庫等檔案,userdata.img包括了一些使用者資料,emulator載入這3個映像檔案後,會把 system和 userdata分別載入到 ramdisk檔案系統中的system和 userdata目錄下。
當然編譯是件很痛苦的事情:
錯誤1:
************************************************************
You are attempting to build on a 32-bit system.
Only 64-bit build environments are supported beyond froyo/2.2.
************************************************************
解決:
需要進行如下修改即可,將
./external/clearsilver/cgi/Android.mk
./external/clearsilver/java-jni/Android.mk
./external/clearsilver/util/Android.mk
./external/clearsilver/cs/Android.mk
四個檔案中的
LOCAL_CFLAGS += -m64
LOCAL_LDFLAGS += -m64
註釋掉,或者將“64”換成“32”
LOCAL_CFLAGS += -m32
LOCAL_LDFLAGS += -m32
然後,將./build/core/main.mk 中的
ifneq (64,$(findstring 64,$(build_arch)))
改為:
ifneq (i686,$(findstring i686,$(build_arch)))
錯誤2:
host C++: libutils <= frameworks/base/libs/utils/RefBase.cpp
frameworks/base/libs/utils/RefBase.cpp: In member function ‘void android::RefBase::weakref_type::trackMe(bool, bool)’:
frameworks/base/libs/utils/RefBase.cpp:483:67: error: passing ‘const android::RefBase::weakref_impl’ as ‘this’ argument of ‘void android::RefBase::weakref_impl::trackMe(bool, bool)’ discards qualifiers [-fpermissive]
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] 錯誤 1
解決:
gedit frameworks/base/libs/utils/Android.mk
Change the line:
LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)
To:
LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) –fpermissive
錯誤3:
host Executable: aapt (out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt)
out/host/linux-x86/obj/STATIC_LIBRARIES/libcutils_intermediates/libcutils.a(threads.o): In function `thread_store_get':
/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:27: undefined reference to `pthread_getspecific'
out/host/linux-x86/obj/STATIC_LIBRARIES/libcutils_intermediates/libcutils.a(threads.o): In function `thread_store_set':
/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:36: undefined reference to `pthread_key_create'
/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:44: undefined reference to `pthread_setspecific'
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt] 錯誤 1
解決:
開啟 frameworks/base/tools/aapt/Android.mk
然後開啟檔案Android.mk,編輯下面一行:
ifeq ($(HOST_OS),linux)
#LOCAL_LDLIBS += -lrt 把這行註釋掉,改為下面一行。
LOCAL_LDLIBS += -lrt -lpthread
endif
錯誤4:
target Dex: core
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# SIGSEGV (0xb) at pc=0x4003d848, pid=7668, tid=2889534320
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_22-b03 mixed mode)
# Problematic frame:
# C [libpthread.so.0+0xa848] pthread_cond_timedwait+0x168
#
# An error report file with more information is saved as hs_err_pid7668.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#
make: *** [out/target/common/obj/JAVA_LIBRARIES/core_intermediates/classes.dex] 已放棄 (core dumped)
解決:
虛擬機器給的記憶體512太小,給個1G試試。然後在本機裡開啟工作管理員,找到虛擬機器程序,優先順序設定為實時。給他最多東西。
錯誤 5:
out/host/linux-x86/obj/STATIC_LIBRARIES/libcutils_intermediates/libcutils.a(threads.o): In function `thread_store_get':
/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:27: undefined reference to `pthread_getspecific'
out/host/linux-x86/obj/STATIC_LIBRARIES/libcutils_intermediates/libcutils.a(threads.o): In function `thread_store_set':
/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:36: undefined reference to `pthread_key_create'
/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:44: undefined reference to `pthread_setspecific'
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/EXECUTABLES/localize_intermediates/localize] 錯誤 1
解決:類似問題3
修改./framework/base/tools/localize/Android.mk檔案
ifeq ($(HOST_OS),linux)
#LOCAL_LDLIBS += -lrt 把這行註釋掉,改為下面一行。
LOCAL_LDLIBS += -lrt -lpthread
endif
錯誤6:
注意:external/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java 使用了未經檢查或不安全的操作。
注意:要了解詳細資訊,請使用 -Xlint:unchecked 重新編譯。注意:external/protobuf/java/src/main/java/com/google/protobuf/micro/CodedInputStreamMicro.java 使用了未經檢查或不安全的操作。
注意:要了解詳細資訊,請使用 -Xlint:unchecked 重新編譯。
Generated: (out/target/product/generic/android-info.txt)
host C: acp <= build/tools/acp/acp.c
host C++: libhost <= build/libs/host/pseudolocalize.cpp
host C: libhost <= build/libs/host/CopyFile.c
<命令列>:0:0: 警告: “_FORTIFY_SOURCE”重定義 [預設啟用]
<built-in>:0:0: 附註: 這是先前定義的位置
<命令列>:0:0: 警告: “_FORTIFY_SOURCE”重定義 [預設啟用]
<built-in>:0:0: 附註: 這是先前定義的位置
In file included from build/libs/host/CopyFile.c:11:0:
build/libs/host/include/host/CopyFile.h:5:22: 致命錯誤: sys/stat.h:沒有那個檔案或目錄
編譯中斷。
In file included from /usr/include/stdlib.h:25:0,
from build/tools/acp/acp.c:11:
/usr/include/features.h:323:26: 致命錯誤: bits/predefs.h:沒有那個檔案或目錄
編譯中斷。
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/CopyFile.o] 錯誤 1
make: *** 正在等待未完成的任務....
make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o] 錯誤 1
<命令列>:0:0: 警告: “_FORTIFY_SOURCE”重定義 [預設啟用]
<built-in>:0:0: 附註: 這是先前定義的位置
In file included from /usr/include/c++/4.6/x86_64-linux-gnu/32/bits/os_defines.h:40:0,
from /usr/include/c++/4.6/x86_64-linux-gnu/32/bits/c++config.h:392,
from /usr/include/c++/4.6/string:40,
from build/libs/host/include/host/pseudolocalize.h:4,
from build/libs/host/pseudolocalize.cpp:1:
/usr/include/features.h:323:26: 致命錯誤: bits/predefs.h:沒有那個檔案或目錄
編譯中斷。
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/pseudolocalize.o] 錯誤 1
注意:某些輸入檔案使用或覆蓋了已過時的 API。注意:要了解詳細資訊,請使用 -Xlint:deprecation 重新編譯。
注意:某些輸入檔案使用了未經檢查或不安全的操作。
注意:要了解詳細資訊,請使用 -Xlint:unchecked 重新編譯。
解決方法:sudo apt-get install libc6-dev-i386
http://www.blogjava.net/ZircoN/archive/2011/11/13/363452.html
錯誤7:
frameworks/base/libs/utils/RefBase.cpp: 在成員函式‘void android::RefBase::weakref_type::trackMe(bool, bool)’中:frameworks/base/libs/utils/RefBase.cpp:483:67: 錯誤: 將‘const android::RefBase::weakref_impl’作為‘void android::RefBase::weakref_impl::trackMe(bool, bool)’的‘this’實參時丟棄了型別限定 [-fpermissive]
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] 錯誤 1
make: *** 正在等待未完成的任務....
frameworks/base/libs/utils/ResourceTypes.cpp: 在成員函式‘void android::ResTable::print(bool) const’中:
frameworks/base/libs/utils/ResourceTypes.cpp:4369:84: 警告: 將一個整數轉換為大小不同的指標 [-Wint-to-pointer-cast]
frameworks/base/libs/utils/ResourceTypes.cpp:4375:43: 警告: 將一個整數轉換為大小不同的指標 [-Wint-to-pointer-cast]
參考網上的解決方法:$ gedit frameworks/base/libs/utils/Android.mk
將下面一行
LOCAL_CFLAGS +=-DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)
改成
LOCAL_CFLAGS +=-DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) –fpermissive
http://www.blogjava.net/ZircoN/archive/2011/11/13/363452.html
問題並沒有解決,反而又出現了新的錯誤:
host C++: libutils <= frameworks/base/libs/utils/Asset.cppg++: –fpermissive:沒有那個檔案或目錄
注意:某些輸入檔案使用或覆蓋了已過時的 API。
注意:要了解詳細資訊,請使用 -Xlint:deprecation 重新編譯。
注意:某些輸入檔案使用了未經檢查或不安全的操作。
注意:要了解詳細資訊,請使用 -Xlint:unchecked 重新編譯。
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/Asset.o] 錯誤 1
make: *** 正在刪除檔案“out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/Asset.o”
make: *** 正在等待未完成的任務....
這個錯誤主要是gcc版本過高引起的:最終解決辦法是:
http://hi.baidu.com/designhouse/blog/item/fec5cdbf8d6a231618d81fc1.html)
ubuntu 11.10的gcc版本是4.6.1,版本太高,編譯android時出錯,要把gcc版本改為4.4.3。
通過gcc -v命令可以發現gcc庫在/usr/lib/gcc/i686-linux-gnu目錄下,該目錄下有當前系統支援的各種版本gcc庫 。在安裝gcc 4.4前該目錄下是沒有4.4目錄的,安裝gcc 4.4後該目錄下就會多出4.4這個目錄,且該4.4目錄下有各種相應庫檔案。
ubuntu 32bit系統下安裝gcc 4.4的最好方法是僅用以下兩條命令,不需要其它命令,否則編譯時可能會出錯。
sudo apt-get install gcc-4.4
sudo apt-get install g++-4.4
裝完後在/usr/bin目錄下$ ls -l gcc*
lrwxrwxrwx 1 root root 7 2011-10-29 09:11 gcc -> gcc-4.6
-rwxr-xr-x 1 root root 224544 2011-10-06 05:47 gcc-4.4
-rwxr-xr-x 1 root root 302104 2011-09-17 05:43 gcc-4.6
發現gcc 連結到gcc-4.6, 需要將它改為連結到gcc-4.4 :sudo mv gcc gcc.bak
sudo ln -s gcc-4.4 gcc
$ls -l g++*
sudo -s
mv g++-4.4 g++
g++ -v
錯誤8:
g++: g++: selected multilib '32' not installedselected multilib '32' not installed
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl] 錯誤 1
make: *** 正在等待未完成的任務....
make: *** [out/host/linux-x86/obj/lib/libESR_Portable.so] 錯誤 1
解決方法:
輸入:sudo apt-get install gcc-multilib
sudo apt-get install g++-multilib後出現新問題:
g++: g++: host SharedLib: libfst (out/host/linux-x86/obj/lib/libfst.so)g++: selected multilib '32' not installedselected multilib '32' not installed
selected multilib '32' not installed
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl] 錯誤 1
make: *** 正在等待未完成的任務....
make: *** [out/host/linux-x86/obj/lib/libESR_Portable.so] 錯誤 1
make: *** [out/host/linux-x86/obj/lib/libfst.so] 錯誤 1
解決方法
sudo apt-get install libc6-dev ia32-libs lib32ncurses5-dev x11proto-core-dev libx11-dev lib32readline-gplv2-dev lib32z-dev libgl1-mesa-dev mingw32 tofrodos python-markdown libxml2-utils
sudo apt-get install g++-4.4-multilib
錯誤9:
Could not load 'clearsilver-jni'
java.library.path = out/host/linux-x86/lib
Could not load 'clearsilver-jni'
java.library.path = out/host/linux-x86/lib
make: *** [out/target/common/docs/api-stubs-timestamp] 錯誤 45
make: *** 正在等待未完成的任務....
make: *** [out/target/common/docs/doc-comment-check-timestamp] 錯誤 45
解決方法:
這是由於clearsilver 在編譯時如果檢測到使用Java JDK 6,就使用64位編譯。要避開此錯誤,需要修改下面四個檔案:
* external/clearsilver/cgi/Android.mk
* external/clearsilver/java-jni/Android.mk
* external/clearsilver/util/Android.mk
* external/clearsilver/cs/Android.mk
把這四個Makefile中的下列語句注掉即可:
# This forces a 64-bit build for Java6
# Comment by Easwy
# LOCAL_CFLAGS += -m64
# LOCAL_LDFLAGS += -m64
然後在external/clearsilver目錄中執行一下make clean,然後回到專案根目錄,繼續make即可。
當編譯完成時,生成的image檔案放在out/target/product/generic目錄中。
gedit /root/.bashrc
export PATH=/root/android/mydroid/out/host/linux-x86/bin:$PATH
export ANDROID_PRODUCT_OUT=/root/android/mydroid/out/target/product/generic
export ANDROID_SWT=/root/android/mydroid/out/host/linux-x86/framework
在原始碼目錄下的out/target/product/generic/目錄下執行
emulator -image system.img -data userdata.img -ramdisk ramdisk.img 命令
錯誤10:
emulator
NAND: could not write file system.img, File exists
另外:還有:
1、許可權不夠遇到多次
/bin/bash: prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gcc: 許可權不夠
/bin/bash: prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gcc: 許可權不夠
/bin/bash: build/core/find-jdk-tools-jar.sh: 許可權不夠
/bin/bash: build/tools/findleaves.py: 許可權不夠
/bin/bash: build/tools/findleaves.py: 許可權不夠
Checking API: checkapi-last
/bin/bash: out/host/linux-x86/bin/apicheck: 許可權不夠
解決:
chmod a+x prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gcc
對所有沒有許可權的檔案增加可執行許可權
2.make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o]
錯誤 1
在32位下編譯,直接make就可以了
在64位下編譯,會出一些錯誤,需要額外安裝一些包:
A, 沒有gnu/stubs-32.h檔案:
/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: 沒有該檔案或目錄
make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o]
錯誤 1
解決方法:
確定你的系統是x86_64 GNU/Linux
[email protected]:/home/mm/android# uname -a
Linux mm-desktop 2.6.27-9-generic #1 SMP Thu Nov 20 22:15:32 UTC 2008 x86_64 GNU/Linux
安裝libc6-dev-i386
sudo apt-get install libc6-dev-i386
B。找不到-lstdc++
/usr/bin/ld: cannot find -lstdc++
解決方法:
安裝 g++-multilib,lib32z1-dev 和 lib32ncurses5-dev
apt-get install g++-4.2-multilib lib32z1-dev lib32ncurses5-dev
3.make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp]
錯誤 1
安裝 g++-4.5-multilib
$ sudo aptitude install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev java-common unixodbc
4.arm-eabi-gcc: error trying to exec 'cc1': execvp: No such file or directory
同事編kernel的時候總是會報下面的錯誤~~最後發現是交叉編譯工具的許可權問題,chmod -R 777 * 就可以了
arm-eabi-gcc: error trying to exec 'cc1': execvp: No such file or directory
總結一下:
1、確認CROSS-COMPILE的目錄在PATH裡面
2、確認cc1是存在的
3、確認交叉編譯工具的許可權
摘錄:
錯誤處理
在Ubuntu10.10(64位)編譯Android2.3原始碼時,遇到各種各樣的問題。不是缺這個,就是少那個。現把這些問題和解決方法羅列出來,供大家參考。
錯誤:
/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: No such file or directory
make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o]
錯誤 1
解決:
sudo apt-get install libc6-dev-i386
錯誤:
make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp] error 1
解決:
sudo apt-get install g++-multilib
錯誤:
external/clearsilver/cgi/cgi.c:22: fatal error: zlib.h: No such file or directory
compilation terminated.
make: *** [out/host/linux-x86/obj/SHARED_LIBRARIES/libneo_cgi_intermediates/cgi.o] Error 1
解決:
sudo apt-get install zlib1g-dev
錯誤:
/usr/bin/ld: cannot find -lz
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt] Error 1
解決:
sudo apt-get install lib32z1-dev
錯誤:
bison -d -o out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp frameworks/base/tools/aidl/aidl_language_y.y
/bin/bash: bison: command not found
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp] Error 127
解決:
sudo apt-get install bison
錯誤:
Lex: aidl <= frameworks/base/tools/aidl/aidl_language_l.l
/bin/bash: flex: command not found
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_l.cpp] Error 127
解決:
sudo apt-get install flex
錯誤:
/usr/bin/ld: cannot find -lncurses
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb] Error 1
解決:
sudo apt-get install lib32ncurses5-dev
錯誤:
prebuilt/linux-x86/sdl/include/SDL/SDL_syswm.h:55: fatal error: X11/Xlib.h: No such file or directory
compilation terminated.
make: *** [out/host/linux-x86/obj/EXECUTABLES/emulator_intermediates/android/main-common.o] Error 1
解決:
sudo apt-get install libx11-dev
錯誤:
sh: gperf: not found
calling gperf failed: 32512 at ./makeprop.pl line 96.
make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/css/CSSPropertyNames.h] Error 25
make: *** Deleting file `out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/css/CSSPropertyNames.h'
解決:
sudo apt-get install gperf
錯誤:
build/core/java.mk:9: *** bin: Target java module does not define any source or resource files. Stop.
解決:
刪除原始碼根目錄下的bin資料夾,這個資料夾是匯入eclipse時建立的。
cannot find -lXXX
所有編譯過程中遇到的類似這樣的錯誤,都是缺少libXXX這樣的庫,解決方法就是:
首先:利用命令:apt-cache search XXX 進行庫搜尋
然後:找那些libXXX-dev這樣的庫進行安裝,命令就是:sudo apt-get install libXXX-dev
最後:繼續執行make
生成韌體
1.在原始碼根目錄下執行一下:
. build/envsetup.sh
2.通過所有編譯(make)或模組編譯(mmm)
需要使用超級使用者進行編譯,要不會出現一下許可權問題
3.通過 export -p 檢視HOME 的路徑是否正確,否則修改 HOME 鎖指向的路徑為home/使用者 中,直接 export HOME="/home/使用者"
4.在“/home/使用者”目錄下新建資料夾 firmware
5.在Android 原始碼根目錄下 執行./mkimage.sh
修改./mkimage.sh 中的路徑指向 “/home/使用者”目錄下的資料夾 firmware
韌體在firmware中生成
錯誤1:
注意:external/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java 使用了未經檢查或不安全的操作。
注意:要了解詳細資訊,請使用 -Xlint:unchecked 重新編譯。注意:external/protobuf/java/src/main/java/com/google/protobuf/micro/CodedInputStreamMicro.java 使用了未經檢查或不安全的操作。
注意:要了解詳細資訊,請使用 -Xlint:unchecked 重新編譯。
Generated: (out/target/product/generic/android-info.txt)
host C: acp <= build/tools/acp/acp.c
host C++: libhost <= build/libs/host/pseudolocalize.cpp
host C: libhost <= build/libs/host/CopyFile.c
<命令列>:0:0: 警告: “_FORTIFY_SOURCE”重定義 [預設啟用]
<built-in>:0:0: 附註: 這是先前定義的位置
<命令列>:0:0: 警告: “_FORTIFY_SOURCE”重定義 [預設啟用]
<built-in>:0:0: 附註: 這是先前定義的位置
In file included from build/libs/host/CopyFile.c:11:0:
build/libs/host/include/host/CopyFile.h:5:22: 致命錯誤: sys/stat.h:沒有那個檔案或目錄
編譯中斷。
In file included from /usr/include/stdlib.h:25:0,
from build/tools/acp/acp.c:11:
/usr/include/features.h:323:26: 致命錯誤: bits/predefs.h:沒有那個檔案或目錄
編譯中斷。
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/CopyFile.o] 錯誤 1
make: *** 正在等待未完成的任務....
make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o] 錯誤 1
<命令列>:0:0: 警告: “_FORTIFY_SOURCE”重定義 [預設啟用]
<built-in>:0:0: 附註: 這是先前定義的位置
In file included from /usr/include/c++/4.6/x86_64-linux-gnu/32/bits/os_defines.h:40:0,
from /usr/include/c++/4.6/x86_64-linux-gnu/32/bits/c++config.h:392,
from /usr/include/c++/4.6/string:40,
from build/libs/host/include/host/pseudolocalize.h:4,
from build/libs/host/pseudolocalize.cpp:1:
/usr/include/features.h:323:26: 致命錯誤: bits/predefs.h:沒有那個檔案或目錄
編譯中斷。
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/pseudolocalize.o] 錯誤 1
注意:某些輸入檔案使用或覆蓋了已過時的 API。注意:要了解詳細資訊,請使用 -Xlint:deprecation 重新編譯。
注意:某些輸入檔案使用了未經檢查或不安全的操作。
注意:要了解詳細資訊,請使用 -Xlint:unchecked 重新編譯。
解決方法:sudo apt-get install libc6-dev-i386
http://www.blogjava.net/ZircoN/archive/2011/11/13/363452.html
錯誤2:
frameworks/base/libs/utils/RefBase.cpp: 在成員函式‘void android::RefBase::weakref_type::trackMe(bool, bool)’中:frameworks/base/libs/utils/RefBase.cpp:483:67: 錯誤: 將‘const android::RefBase::weakref_impl’作為‘void android::RefBase::weakref_impl::trackMe(bool, bool)’的‘this’實參時丟棄了型別限定 [-fpermissive]
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] 錯誤 1
make: *** 正在等待未完成的任務....
frameworks/base/libs/utils/ResourceTypes.cpp: 在成員函式‘void android::ResTable::print(bool) const’中:
frameworks/base/libs/utils/ResourceTypes.cpp:4369:84: 警告: 將一個整數轉換為大小不同的指標 [-Wint-to-pointer-cast]
frameworks/base/libs/utils/ResourceTypes.cpp:4375:43: 警告: 將一個整數轉換為大小不同的指標 [-Wint-to-pointer-cast]
參考網上的解決方法:$ gedit frameworks/base/libs/utils/Android.mk
將下面一行
LOCAL_CFLAGS +=-DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)
改成
LOCAL_CFLAGS +=-DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) –fpermissive
http://www.blogjava.net/ZircoN/archive/2011/11/13/363452.html
問題並沒有解決,反而又出現了新的錯誤:
host C++: libutils <= frameworks/base/libs/utils/Asset.cppg++: –fpermissive:沒有那個檔案或目錄
注意:某些輸入檔案使用或覆蓋了已過時的 API。
注意:要了解詳細資訊,請使用 -Xlint:deprecation 重新編譯。
注意:某些輸入檔案使用了未經檢查或不安全的操作。
注意:要了解詳細資訊,請使用 -Xlint:unchecked 重新編譯。
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/Asset.o] 錯誤 1
make: *** 正在刪除檔案“out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/Asset.o”
make: *** 正在等待未完成的任務....
這個錯誤主要是gcc版本過高引起的:最終解決辦法是:
http://hi.baidu.com/designhouse/blog/item/fec5cdbf8d6a231618d81fc1.html)
ubuntu 11.10的gcc版本是4.6.1,版本太高,編譯android時出錯,要把gcc版本改為4.4.3。
通過gcc -v命令可以發現gcc庫在/usr/lib/gcc/i686-linux-gnu目錄下,該目錄下有當前系統支援的各種版本gcc庫 。在安裝gcc 4.4前該目錄下是沒有4.4目錄的,安裝gcc 4.4後該目錄下就會多出4.4這個目錄,且該4.4目錄下有各種相應庫檔案。
ubuntu 32bit系統下安裝gcc 4.4的最好方法是僅用以下兩條命令,不需要其它命令,否則編譯時可能會出錯。
sudo apt-get install gcc-4.4
sudo apt-get install g++-4.4
裝完後在/usr/bin目錄下$ ls -l gcc*
lrwxrwxrwx 1 root root 7 2011-10-29 09:11 gcc -> gcc-4.6
-rwxr-xr-x 1 root root 224544 2011-10-06 05:47 gcc-4.4
-rwxr-xr-x 1 root root 302104 2011-09-17 05:43 gcc-4.6
發現gcc 連結到gcc-4.6, 需要將它改為連結到gcc-4.4 :sudo mv gcc gcc.bak
sudo ln -s gcc-4.4 gcc
錯誤3:
g++: g++: selected multilib '32' not installedselected multilib '32' not installed
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl] 錯誤 1
make: *** 正在等待未完成的任務....
make: *** [out/host/linux-x86/obj/lib/libESR_Portable.so] 錯誤 1
解決方法:
輸入:sudo apt-get install gcc-multilib
sudo apt-get install g++-multilib後出現新問題:
g++: g++: host SharedLib: libfst (out/host/linux-x86/obj/lib/libfst.so)g++: selected multilib '32' not installedselected multilib '32' not installed
selected multilib '32' not installed
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl] 錯誤 1
make: *** 正在等待未完成的任務....
make: *** [out/host/linux-x86/obj/lib/libESR_Portable.so] 錯誤 1
make: *** [out/host/linux-x86/obj/lib/libfst.so] 錯誤 1
解決方法
sudo apt-get install libc6-dev ia32-libs lib32ncurses5-dev x11proto-core-dev libx11-dev lib32readline-gplv2-dev lib32z-dev libgl1-mesa-dev mingw32 tofrodos python-markdown libxml2-utils
sudo apt-get install g++-4.4-multilib
錯誤4:
Could not load 'clearsilver-jni'
java.library.path = out/host/linux-x86/lib
Could not load 'clearsilver-jni'
java.library.path = out/host/linux-x86/lib
make: *** [out/target/common/docs/api-stubs-timestamp] 錯誤 45
make: *** 正在等待未完成的任務....
make: *** [out/target/common/docs/doc-comment-check-timestamp] 錯誤 45
解決方法:
這是由於clearsilver 在編譯時如果檢測到使用Java JDK 6,就使用64位編譯。要避開此錯誤,需要修改下面四個檔案:
* external/clearsilver/cgi/Android.mk
* external/clearsilver/java-jni/Android.mk
* external/clearsilver/util/Android.mk
* external/clearsilver/cs/Android.mk
把這四個Makefile中的下列語句注掉即可:
# This forces a 64-bit build for Java6
# Comment by Easwy
# LOCAL_CFLAGS += -m64
# LOCAL_LDFLAGS += -m64
然後在external/clearsilver目錄中執行一下make clean,然後回到專案根目錄,繼續make即可。
當編譯完成時,生成的image檔案放在out/target/product/generic目錄中。
gedit /root/.bashrc
export PATH=/root/android/mydroid/out/host/linux-x86/bin:$PATH
export ANDROID_PRODUCT_OUT=/root/android/mydroid/out/target/product/generic
export ANDROID_SWT=/root/android/mydroid/out/host/linux-x86/framework
在原始碼目錄下的out/target/product/generic/目錄下執行
emulator -image system.img -data userdata.img -ramdisk ramdisk.img 命令
錯誤5:
emulator
編譯Android原始碼
請按照“獲取Android原始碼”一節中的內容安裝所需的相關包,否則在編譯原始碼的時候會報很多的錯。為了方便起見,現將所有需要安裝的包羅列如下,其中有些包是可選的,但最好都裝上,同時,在安裝之前,最好先更新一下:
$ sudo aptitude update
$ sudo aptitude upgrade
Ubuntu Linux(32位x86)
$ sudo aptitude install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev make gcc g++ libc6‐dev patch texinfo ncurses‐dev python2.6 valgrind lib32readline5-dev
$ sudo aptitude install sun‐java6‐jdk
Ubuntu Linux(64位x86)
$ sudo apt-get install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev make gcc g++ libc6-dev patch texinfo ncurses-dev python2.6 valgrind gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev
$ sudo ln -s /usr/lib32/libX11.so.6 /usr/lib32/libX11.so
$ sudo aptitude install sun‐java6‐jdk
基本上安裝上面羅列的包,編譯時就不會有太大的問題,下面列舉本人(64位機子,Ubuntu10.04系統)在編譯時出現的一些錯誤,以及在出現錯誤時,相關的解決包。雖然google已將這些必需包在android
/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: No such file or directory make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o] Error 1
解決包:$ sudo aptitude install libc6-dev-i386
/usr/bin/ld: cannot find -lstdc++
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl] Error 1
dpkg-query -l &> packages.txt(該工具可用來查詢dpkg資料庫)
解決包:$ sudo aptitude install g++-multilib
/usr/bin/ld: cannot find -lncurses
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb] Error 1
make: *** Waiting for unfinished jobs....
解決包:$ sudo aptitude search lib32ncurses5-dev
/usr/bin/ld: cannot find -lz
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/EXECUTABLES/zipalign_intermediates/zipalign] Error 1
make: *** Waiting for unfinished jobs....
解決包:$ sudo aptitude install lib32z-dev
提出了使用getlibs(該工具可自動解決32位程式在64位系統上的依賴關係)來解決這個問題。具體用法如下:
$ getlibs -l lib