2012-04-16 64 views
1

我從source.android.com下載Android的源和依照指示在Mac OS X上安裝編譯環境,一切正常,除了當我運行make它給了我下面的錯誤大廈Android源代碼

============================================ 
PLATFORM_VERSION_CODENAME=REL 
PLATFORM_VERSION=4.0.1 
TARGET_PRODUCT=full 
TARGET_BUILD_VARIANT=eng 
TARGET_BUILD_TYPE=release 
TARGET_BUILD_APPS= 
TARGET_ARCH=arm 
TARGET_ARCH_VARIANT=armv7-a 
HOST_ARCH=x86 
HOST_OS=darwin 
HOST_BUILD_TYPE=release 
BUILD_ID=ITL41D 
============================================ 
host C++: aapt <= frameworks/base/tools/aapt/AaptAssets.cpp 
frameworks/base/tools/aapt/AaptAssets.cpp:2161:38: warning: unused parameter 'bundle' [-Wunused-parameter] 
AaptAssets::slurpResourceZip(Bundle* bundle, const char* filename) 
            ^
In file included from frameworks/base/tools/aapt/AaptAssets.cpp:5: 
In file included from frameworks/base/tools/aapt/AaptAssets.h:10: 
In file included from frameworks/base/include/utils/AssetManager.h:25: 
frameworks/base/include/utils/KeyedVector.h:193:17: error: use of undeclared identifier 'indexOfKey' 
    ssize_t i = indexOfKey(key); 
       ^
       this-> 
frameworks/base/tools/aapt/AaptAssets.h:446:46: note: in instantiation of member function 'android::DefaultKeyedVector<android::String8, android::sp<AaptSymbols> >::valueFor' requested here 
     sp<AaptSymbols> sym = mNestedSymbols.valueFor(name); 
              ^
frameworks/base/include/utils/KeyedVector.h:66:29: note: must qualify identifier to find this declaration in dependent base class 
      ssize_t   indexOfKey(const KEY& key) const; 
          ^
1 warning and 1 error generated. 
make: *** [out/host/darwin-x86/obj/EXECUTABLES/aapt_intermediates/AaptAssets.o] Error 1 

我剛開始在android中,所以沒有任何線索,任何小幫助也將不勝感激

+0

什麼命令你開始運行編譯器之前? – 2012-04-16 10:18:16

+0

source build/envsetup.sh然後午餐full-eng然後make -j4 – Pete 2012-04-16 10:44:33

回答

3

我終於找出了問題。 frameworks/base/include/utils/KeyedVector.h的源代碼存在錯誤:某些成員函數需要使用Scope解析運算符「this->」在MAC OS X Lion上構建android源代碼xcode 4.3.x和gcc版本4.9.2(Debian 4.9.2-10)。 沒有範圍解析操作符編譯器將無法識別函數的存在。

開放框架/鹼/包含/ utils的/ KeyedVector.h

更改從線193:

ssize_t i = indexOfKey(key); 

ssize_t i = this->indexOfKey(key); 

和Android 4.0.1編譯。

+4

這是什麼意思?請給進一步的指示,這樣可以幫助我們其他人 – MobileMon 2012-09-11 15:21:06

+0

什麼?我還得到任何東西 – mthama 2014-11-19 17:46:02

+0

「frameworks/base/include/utils/KeyedVector.h」的源代碼中有錯誤: 行193 至少發生在gcc版本4.9.2(Debian 4.9.2-10) 。 更改從那裏的行: 'ssize_t供I = indexOfKey(鍵);' 到'ssize_t供I =這個 - > indexOfKey(鍵);' 就是這樣。 – 2015-10-15 08:15:48

3

只是爲了擴大對皮特的回答,萬一真的有人想知道:

的indexOfKey在DefaultKeyVector的父類,KeyedVector定義。對於類模板,函數調用在編譯期間解析,而不是在運行期間解析。發生錯誤是因爲在調用indexOfKey時,編譯器不知道模板函數可能位於何處。這是基礎和派生類什麼樣子:

template <typename KEY, typename VALUE> 
class KeyedVector 
{ 
... 
    ssize_t indexOfKey(const KEY& key) const; 
... 


template <typename KEY, typename VALUE> 
class DefaultKeyedVector : public KeyedVector<KEY, VALUE> 
{ 
... 

而且違規的呼叫:

template<typename KEY, typename VALUE> inline 
const VALUE& DefaultKeyedVector<KEY,VALUE>::valueFor(const KEY& key) const { 
    ssize_t i = indexOfKey(key); 
... 

最有可能的,使用舊的MacOS的SDK編譯器(或其他編譯器)的作品,因爲它可能只是猜測函數存在於某些基類中,而不是失敗。但是,這不是標準行爲。

從這clang entry和從C++ FAQ更多的信息。

0

用make -j在Mac OS X瀏覽器瀏覽器建設爲Android 4.0.3,當我面對這個問題好幾次10.8.4。我沒有任何與Android 4.2.1的問題。 所以我的解決辦法是

make CC=gcc CXX=g++ -j Browser

希望它可以幫助