隨筆-348  評論-598  文章-0  trackbacks-0

          Linux x86 編譯 Android 遭遇 gnu/stubs-64.h

          這兩天心血來潮,執行完 repo sync 后,順手來了一下 make,不料卻發現了以下的錯誤:

          host C: libclearsilver-jni <= external/clearsilver/java-jni/j_neo_util.c
          In file included from /usr/include/features.h:378,
          from /usr/include/string.h:26,
          from external/clearsilver/java-jni/j_neo_util.c:1:
          /usr/include/gnu/stubs.h:9:27: error: gnu/stubs-64.h: No such file or directory
          make: *** [out/host/linux-x86/obj/SHARED_LIBRARIES/libclearsilver-jni_intermediates/j_neo_util.o] Error 1

          兵來將擋,水來土掩,用關鍵字 android “error: gnu/stubs-64.h: no such file or directory” 來搜一下吧,發現搜索結果寥寥無幾,看樣子問題比較新,其中有一個 CSDN 的鏈接,就順手點了過去。帖子反映的問題和我一模一樣,不過它的分析給了我一些提醒。

          從錯誤信息入手,追蹤到/usr/include/gnu/stubs.h,看到如下代碼:

          #if __WORDSIZE == 32
          # include <gnu/stubs-32.h>
          #elif __WORDSIZE == 64
          # include <gnu/stubs-64.h>
          #else
          # error "unexpected value for __WORDSIZE macro"
          #endif

          順著 WORDSIZE,進入/usr/include/bits/wordsize,發現:

          #if defined __x86_64__
          # define __WORDSIZE 64
          # define __WORDSIZE_COMPAT32 1
          #else
          # define __WORDSIZE 32
          #endif

          結合報錯的信息,可以知道這里一定是有定義__x86_64__,執行一下 uname -a 可以確認 OS 明明是x86,為什么會__x86_64__呢?追根溯源, Android 源碼或許能露出蛛絲馬跡。

          果不其然,從 android.git.kernel.org 的 platform/external/clearsilver.git 上,看到5天前,有個 Ying Wang 的家伙提交一個修改:Fix 64-bit clearsilver shared library issue,參看這里,修改內容中 java-jni/Android.mk,和出現本次問題的路徑 java-jni/j_neo_util.c,同屬一個父目錄,看樣子有點關系,查看 Android.mk 的修改內容,發現做了如下修改:

          +# This forces a 64-bit build for Java6
          +ifneq ($(filter 1.6%,$(java_version)),)
          +    LOCAL_CFLAGS += -m64
          +    LOCAL_LDFLAGS += -m64
          +endif

          當發現你使用Java6時,它將強制使用64-bit,我想這就能解釋__x86_64__出現的原因。那么既然它要64-bit,我就滿足它。首先要解決 gnu/stubs-64.h: No such file or directory,解決這個問題需要執行以下命令:

          [xuhj@eniac mydroid]$ apt-get install libc6-dev-amd64

          完成以后再執行 make,發現有錯誤:

          /usr/bin/ld: cannot find -lstdc++

          那就繼續滿足它:

          [xuhj@eniac mydroid]$ apt-get install g++-multilib lib64stdc++6

          還是不行,又發生下面的錯誤:

          /usr/bin/ld: cannot find -lz

          再來執行命令:

          [xuhj@eniac mydroid]$ apt-get install lib64z1-dev
          照此方法后出現
          Could not load ‘clearsilver-jni’
          不知是否因為“libclearsilver-jni.so”為64bit,在32bit系統無法加載?
          最后把java,javac默認改為1.5通過了編譯。
          如果還是有錯,需要執行如下命令:
          make clean
          make update-api (經測試,這個可以不需要)
          make


          /usr/bin/ld: cannot find -lncurses
          這個問題是因為沒有安裝
          ncurses-devel包
          sudo apt-get install libncurses5-dev

          error: X11/Xlib.h No such file or directory
          you need to install the packages "libx11-dev" and "libglpk0-dev".

          修改Java當前版本的命令:
          sudo update-alternatives – –config java


          ---------------------------------------------------------
          專注移動開發

          Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
          posted on 2010-09-19 12:24 TiGERTiAN 閱讀(1808) 評論(0)  編輯  收藏 所屬分類: Android
          主站蜘蛛池模板: 西华县| 临颍县| 嵊泗县| 洪雅县| 铅山县| 永丰县| 南溪县| 河西区| 来宾市| 稻城县| 布拖县| 德昌县| 灵武市| 松阳县| 沅陵县| 新泰市| 正阳县| 南雄市| 桃源县| 柳林县| 巴彦淖尔市| 罗山县| 沛县| 三河市| 湟源县| 清水河县| 井陉县| 武穴市| 东莞市| 宣武区| 聊城市| 云龙县| 上高县| 白朗县| 旬邑县| 瑞安市| 西充县| 行唐县| 舞钢市| 普定县| 曲麻莱县|