0

我已經使用buildroot生成了uclib,並用它來編譯mpich for ARM設備。然後我創建了Android項目並將libmpich.a和Include文件夾複製到此處的項目Android.mk中:將libmpich鏈接到android NDK

LOCAL_PATH := $(call my-dir) 
# static library info 

LOCAL_MODULE_FILENAME:= libmpich 
LOCAL_MODULE := libmpich 
LOCAL_SRC_FILES := ../prebuilt/libmpich.a 
LOCAL_EXPORT_C_INCLUDES := ../prebuilt/include 
LOCAL_STATIC_LIBRARIES := libmpich 
include $(PREBUILT_STATIC_LIBRARY) 

# wrapper info 
include $(CLEAR_VARS) 

LOCAL_C_INCLUDES += ../prebuilt/include 
LOCAL_MODULE := ndk1 
LOCAL_SRC_FILES := native.c 
LOCAL_STATIC_LIBRARIES := libmpich 
include $(BUILD_SHARED_LIBRARY) 

NDK建造後,我得到了以下錯誤

jni/../prebuilt/libmpich.a(initthread.o):initthread.c:function PMPI_Init_thread: error: undefined reference to 'MPL_env2bool' 
jni/../prebuilt/libmpich.a(msgprint.o):msgprint.c:function MPIU_Usage_printf: error: undefined reference to 'stdout' 
jni/../prebuilt/libmpich.a(msgprint.o):msgprint.c:function MPIU_Error_printf: error: undefined reference to 'stderr' 
jni/../prebuilt/libmpich.a(msgprint.o):msgprint.c:function MPIU_Internal_error_printf: error: undefined reference to 'stderr' 
jni/../prebuilt/libmpich.a(msgprint.o):msgprint.c:function MPIU_Internal_sys_error_printf: error: undefined reference to 'stderr' 
jni/../prebuilt/libmpich.a(msgprint.o):msgprint.c:function MPIU_Msg_printf: error: undefined reference to 'stdout' 
jni/../prebuilt/libmpich.a(dbg_printf.o):dbg_printf.c:function MPIU_dbg_printf: error: undefined reference to 'stdout' 
jni/../prebuilt/libmpich.a(dbg_printf.o):dbg_printf.c:function MPIU_dump_dbg_memlog_to_stdout: error: undefined reference to 'stdout' 
jni/../prebuilt/libmpich.a(param_vals.o):param_vals.c:function MPIR_Param_init_params: error: undefined reference to 'MPL_env2int' 
jni/../prebuilt/libmpich.a(param_vals.o):param_vals.c:function MPIR_Param_init_params: error: undefined reference to 'MPL_env2int' 
jni/../prebuilt/libmpich.a(param_vals.o):param_vals.c:function MPIR_Param_init_params: error: undefined reference to 'MPL_env2int' 
jni/../prebuilt/libmpich.a(param_vals.o):param_vals.c:function MPIR_Param_init_params: error: undefined reference to 'MPL_env2int' 
jni/../prebuilt/libmpich.a(param_vals.o):param_vals.c:function MPIR_Param_init_params: error: undefined reference to 'MPL_env2bool' 
jni/../prebuilt/libmpich.a(param_vals.o):param_vals.c:function MPIR_Param_init_params: error: undefined reference to 'MPL_env2bool' 
jni/../prebuilt/libmpich.a(param_vals.o):param_vals.c:function MPIR_Param_init_params: error: undefined reference to 'MPL_env2bool' 
jni/../prebuilt/libmpich.a(param_vals.o):param_vals.c:function MPIR_Param_init_params: error: undefined reference to 'MPL_env2str' 
jni/../prebuilt/libmpich.a(param_vals.o):param_vals.c:function MPIR_Param_init_params: error: undefined reference to 'MPL_env2str' 
jni/../prebuilt/libmpich.a(mpid_abort.o):mpid_abort.c:function MPID_Abort: error: undefined reference to 'stderr' 
jni/../prebuilt/libmpich.a(mpid_vc.o):mpid_vc.c:function MPIDI_Populate_vc_node_ids: error: undefined reference to '__errno_location' 
jni/../prebuilt/libmpich.a(mpid_vc.o):mpid_vc.c:function MPIDI_Populate_vc_node_ids: error: undefined reference to '__ctype_b' 
jni/../prebuilt/libmpich.a(init.o):init.c:function PMPI_Init: error: undefined reference to 'MPL_env2str' 
jni/../prebuilt/libmpich.a(strerror.o):strerror.c:function MPIU_Strerror: error: undefined reference to '__xpg_strerror_r' 
jni/../prebuilt/libmpich.a(simple_pmi.o):simple_pmi.c:function accept_one_connection: error: undefined reference to '__errno_location' 
jni/../prebuilt/libmpich.a(simple_pmi.o):simple_pmi.c:function PMI_Init: error: undefined reference to '__errno_location' 
jni/../prebuilt/libmpich.a(sock.o):sock.c:function MPIDU_Socki_event_enqueue.isra.1: error: undefined reference to '__errno_location' 
jni/../prebuilt/libmpich.a(sock.o):sock.c:function MPIDU_Sock_listen: error: undefined reference to 'MPL_env2range' 
collect2: error: ld returned 1 exit status 
make: *** [obj/local/armeabi/libndk1.so] Error 1 

我不明白爲什麼它沒有被正確鏈接和缺什麼

更新: 當我將libmpl.a添加到項目中時,所有MPL錯誤都消失了

+0

您是否使用android toolchain構建了'libmpich.a'?爲了安全起見,請使用與您爲** libndk1.so **使用** ndk-build **調用的工具鏈相同的工具鏈。 –

回答

0

我認爲您的問題發生是因爲您的靜態lib libmpich.a依賴於另一個lib。

你要解決此問題的兩種diffenrent方式:

  1. 導入您的Android.mk靜態庫由您libmpich.a靜態庫所需的任何庫。這種方法的問題在於,如果你有很多的依賴性,那麼這個問題可能會很長並且很痛苦。

  2. 構建libmpich作爲動態庫,因爲動態庫與它們的依賴性打包在一起。我知道你如何建立你的圖書館,所以我不知道這是否會很難實現。一旦你有libmpich.so作爲動態庫而不是靜態庫導入到Android.mk

+0

當我將libc.a添加到projet時,錯誤消失了,但仍存在運行時錯誤 – Doha