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 中的順序和那個和依賴關係有關係,越基礎的庫放在越後面!!!