ndk-build時各種詭異的undefined reference–

來源:互聯網
上載者:User
ndk-build時各種詭異的undefined reference解決方案

在編譯自己編碼的AndroidRTSP播放器網路程式庫時,網路程式庫引用到了Android NDK編譯出的live555子模組庫,編譯會遇到遇到報各種 undefined reference to xxxx方法, 但是這些方法有都存在live555的各個模組的庫中

我想看編譯出來的o檔案, 那個c檔案對應的o檔案存在,Android.mk檔案也是經過各種驗證的,,引用庫也引用到了.
結果網上查資料查到有一種說法說是引用庫的順序問題, 越基礎的庫就越要寫到後面. 根據這種說法修改庫引用順序,live555中各個模組庫的引用順序,:

liveMedia  groupsock  BasicUsageEnvironment  UsageEnvironment

當然最基礎的引用庫放在最後面,再次編譯結果OK了…,順利產生了庫檔案,雖然還不能調用成功...

註:

ndk 構建注意事項

ndk 構建注意事項

1, Android.mk 和 Application.mk 的預設位置放在 jni,最好不要改這個位置,不然後果很嚴重!

2, 產生一個靜態庫(.a)一定要在 Application.mk 中加入 APP_MODULES := libxxmod, 不然執行 ndk-build 沒一點兒反應

3, LOCAL_C_INCLUDES 中的目錄最好這樣寫 LOCAL_C_INCLUDES := $(LOCAL_PATH)/../xxlib/include, 不然不在 jni 目錄下 啟動 ndk-build,則找不到那些 .h

4, 為了支援 exceptions 和 rtti 特性 Application.mk 中要加入 APP_STL := gnustl_static 或者 APP_STL := gnustl_shared
5, 編譯 Lua 5.2 需要定義宏 LOCAL_CFLAGS += -D"getlocaledecpoint()='.'" 不然 llex.c:214 會編譯失敗, 原因是 ndk 內建的 Bionic C 庫 localeconv 函數返回的 struct lconv 是個空結構
6, 編譯 Freetype 需要定義宏 LOCAL_CFLAGS += -DFT2_BUILD_LIBRARY, 不然不會 #include <freetype/internal/internal.h> 導致編譯失敗

7, 多個靜態庫連結成一個動態庫時 LOCAL_STATIC_LIBRARIES 中的順序和庫之間的依賴順序有關係, 不然會連結不成功, 而且在 include xx-prebuilt.mk 是不要用 $(LOCAL_PATH), 因為可能這個被修改, 導致莫名其名的找不到 .mk, 應該這樣

CONST_PATH := $(call my-dir)
...
include $(BUILD_SHARED_LIBRARY)
...
include $(CONST_PATH)/../../xx/jni/xx-prebuilt.mk

include $(CONST_PATH)/../../yy/jni/yy-prebuilt.mk

ps: LOCAL_STATIC_LIBRARIES 中的順序和那個和依賴關係有關係,越基礎的庫放在越後面!!!

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.