неопределенные ссылки, связывающие предварительно созданную общую библиотеку в Android с NDK

#android #linker #shared-libraries #android-ndk

#Android #компоновщик #разделяемые библиотеки #android-ndk

Вопрос:

У меня есть предварительно созданная общая библиотека под названием «tshark.so «которую я пытаюсь связать всякий раз, когда создаю другую общую библиотеку (libwireshark_helper.so ). libtshark.so находится в $ (LOCAL_PATH). Вот мой Android.mk

 LOCAL_PATH:= $(call my-dir)                                                                                                                                                                                                                                                        
include $(CLEAR_VARS)                                                                                                                                                                                                                                                              
NDK_MODULE_PATH := $(LOCAL_PATH)                                                                                                                                                                                                                                                   
LOCAL_SRC_FILES:= wireshark_helper.c                                                                                                                                                                                                                                
LOCAL_MODULE := libwireshark_helper                                                                                                                                                                                                                                                
LOCAL_PREBUILT_LIBS := libtshark.so                                                                                                                                                                                                                                                
LOCAL_C_INCLUDES  = jni/libusb-compat/libusb jni/wispy jni/libpcap jni/libwireshark jni/libglib jni/libglib/glib jni/libglib/android jni/libwireshark/epan jni/libwireshark/epan/dissectors                                                                                        
LOCAL_SHARED_LIBRARIES := libc libusb libusb-compat libwispy libpcap libglib-2.0 libgmodule-2.0 libnl libtshark                                                                                                                                                                    
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -L$(LOCAL_PATH) -llog -ltshark -lgcc -lz                                                                                                                                                                                                      
include $(BUILD_SHARED_LIBRARY)
  

Например, библиотека ‘tshark’ содержит метод ‘tshark_log_handler’, который показан здесь:

 $ arm-eabi-nm libtshark.so | grep tshark_log_handler
005d298c t tshark_log_handler
  

Однако, когда я пытаюсь выполнить сборку, я получаю сообщение об ошибке:

 SharedLibrary  : libwireshark_helper.so
/Users/gnychis/Documents/android-ndk-r5b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-g   -Wl,-soname,libwireshark_helper.so -shared --sysroot=/Users/gnychis/Documents/android-ndk-r5b/platforms/android-9/arch-arm   /Users/gnychis/Documents/workspace/CoexiSyst/obj/local/armeabi/objs-debug/wireshark_helper/wireshark_helper.o    /Users/gnychis/Documents/workspace/CoexiSyst/obj/local/armeabi/libusb.so /Users/gnychis/Documents/workspace/CoexiSyst/obj/local/armeabi/libusb-compat.so /Users/gnychis/Documents/workspace/CoexiSyst/obj/local/armeabi/libwispy.so /Users/gnychis/Documents/workspace/CoexiSyst/obj/local/armeabi/libpcap.so /Users/gnychis/Documents/workspace/CoexiSyst/obj/local/armeabi/libglib-2.0.so /Users/gnychis/Documents/workspace/CoexiSyst/obj/local/armeabi/libgmodule-2.0.so /Users/gnychis/Documents/workspace/CoexiSyst/obj/local/armeabi/libnl.so /Users/gnychis/Documents/android-ndk-r5b/platforms/android-9/arch-arm/usr/lib/libc.so /Users/gnychis/Documents/android-ndk-r5b/platforms/android-9/arch-arm/usr/lib/libstdc  .so /Users/gnychis/Documents/android-ndk-r5b/platforms/android-9/arch-arm/usr/lib/libm.so   -Wl,--no-undefined -Wl,-z,noexecstack -L/Users/gnychis/Documents/android-ndk-r5b/platforms/android-9/arch-arm/usr/lib -L/Users/gnychis/Documents/android-ndk-r5b/platforms/android-9/arch-arm/usr/lib -L/Users/gnychis/Documents/workspace/CoexiSyst/jni/libwireshark -llog -ltshark -lgcc -lz -Wl,-rpath-link=/Users/gnychis/Documents/android-ndk-r5b/platforms/android-9/arch-arm/usr/lib -lsupc   -o /Users/gnychis/Documents/workspace/CoexiSyst/obj/local/armeabi/libwireshark_helper.so
/Users/gnychis/Documents/workspace/CoexiSyst/obj/local/armeabi/objs-debug/wireshark_helper/wireshark_helper.o: In function `Java_com_gnychis_coexisyst_CoexiSyst_wiresharkHello':
/Users/gnychis/Documents/workspace/CoexiSyst/jni/libwireshark/wireshark_helper.c:124: undefined reference to `tshark_log_handler'
  

Почему я должен получать неопределенную ссылку? Это находится в моей общей библиотеке, и в моей команде gcc есть «-ltshark». Я не получаю сообщение об ошибке, что он не может найти эту библиотеку.

Ответ №1:

Тип символа «t» из nm означает, что символ есть в библиотеке, но он не является глобальным. Глобальные функции отображаются в виде символа типа «T». Другими словами, функция была объявлена с ключевым словом «static», и вы не можете использовать его в своем коде.

Комментарии:

1. У меня похожая проблема, единственное, что отличается, это среда, моя среда — Android. Когда я запустил «nm» в своей библиотеке «libCommonAPI.so » в функции createProxy (…) была буква «T», но я все равно получил неопределенную ссылку. В чем может быть проблема в этом случае?