将 libmpich 链接到 android NDK

Link libmpich to android NDK

提问人:Doha 提问时间:11/27/2015 最后编辑:Doha 更新时间:12/2/2015 访问量:493

问:

我使用 buildroot 生成了 Uclib,并用它来为 ARM 设备编译 mpich。然后我创建了 Android 项目并将 libmpich.a 和 Include 文件夹复制到项目中,这是 Android.mk:

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-build之后,我收到以下错误

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 错误都消失了

android-ndk static-libraries 静态链接 未定义引用

评论

0赞 Alex Cohn 11/30/2015
你是用安卓工具链构建的吗?为了安全起见,请使用与使用 ndk-build for libndk1.so 调用的工具链相同的工具链。libmpich.a

答:

0赞 sonic 12/2/2015 #1

我认为您的问题发生是因为您的静态库依赖于另一个库。libmpich.a

您有两种不同的方法可以解决这个问题:

  1. 将静态库所需的任何库导入静态库中的静态库。这种方法的问题在于,如果你有很多依赖性,可能会非常漫长和痛苦。libmpich.aAndroid.mk

  2. 构建为动态库,因为动态库是与其依赖项打包的。我知道你是如何建立你的图书馆的,所以我不知道这是否很难实现。一旦您将其作为动态库而不是静态库导入到您的中。libmpichlibmpichlibmpich.soAndroid.mk

评论

0赞 Doha 12/2/2015
当我将libc.a添加到projet时,错误消失了,尽管仍然存在运行时错误