Android — Как сделать журнал ошибок более подробно о неопределенной ссылке на

Мне нужно скомпилировать код на c / c ++. Используя инструменты NDK и Cygwin, я не раз сталкивался с ошибкой «неопределенная ссылка на». Большинство парней сказали, что это вызвано вызовом функции, файл которой не включен в ваш исходный файл. Тем не менее, я мало знаю о c / c ++, а также журнал ошибок дает нечеткую информацию, поэтому я не могу знать, в каком файле какая строка вызывает проблему, даже не знаю, какой именно lib-файл мне действительно нужен.

Я надеюсь, что я найду некоторые инструменты или способы решения таких проблем, чтобы найти строку ошибки или получить более подробную информацию об ошибке.

Большое спасибо.

Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
include ../includeOpenCV.mk
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
#try to load OpenCV.mk from default install location
include $(TOOLCHAIN_PREBUILT_ROOT)/user/share/OpenCV/OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif
LOCAL_MODULE:=AvatarSpeak
LOCAL_SRC_FILES:=AvatarSpeak.cpp
LOCAL_LDLIBS    := -llog
include $(BUILD_SHARED_LIBRARY)

$ NDK / ndk-build V = 1

$ $NDK/ndk-build V=1
rm -f ./libs/armeabi/lib*.so ./libs/armeabi-v7a/lib*.so ./libs/mips/lib*.so        ./libs/x86/lib*.so
rm -f ./libs/armeabi/gdbserver ./libs/armeabi-v7a/gdbserver ./libs/mips/gdbserver     ./libs/x86/gdbserver
rm -f ./libs/armeabi/gdb.setup ./libs/armeabi-v7a/gdb.setup ./libs/mips/gdb.setup      ./libs/x86/gdb.setup
Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
mkdir -p ./libs/armeabi
install -p /cygdrive/d/android-ndk-r8b/prebuilt/android-arm/gdbserver/gdbserver   ./libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
mkdir -p ./libs/armeabi
echo "set solib-search-path ./obj/local/armeabi" > ./libs/armeabi/gdb.setup
echo "directory D:/android-ndk-r8b/platforms/android-14/arch-arm/usr/include   "../../OpenCV-2.3.1/share/OpenCV/../../include/opencv" "../../OpenCV-    2.3.1/share/OpenCV/../../include" D:/android-ndk-r8b/sources/cxx-stl/gnu-     libstdc++/4.6/include D:/android-ndk-r8b/sources/cxx-stl/gnu-    libstdc++/4.6/libs/armeabi/include jni" >> ./libs/armeabi/gdb.setup
SharedLibrary  : libAvatarSpeak.so
/cygdrive/d/android-ndk-r8b/toolchains/arm-linux-androideabi-     4.6/prebuilt/windows/bin/arm-linux-androideabi-g++  -Wl,-soname,libAvatarSpeak.so  -shared       --sysroot=D:/android-ndk-r8b/platforms/android-14/arch-arm  ./obj/local/armeabi/objs-      debug/AvatarSpeak/com_huawei_avatar_AvatarSpeak.o ./obj/local/armeabi/libopencv_contrib.a       ./obj/local/armeabi/libopencv_calib3d.a ./obj/local/armeabi/libopencv_objdetect.a       ./obj/local/armeabi/libopencv_features2d.a ./obj/local/armeabi/libopencv_video.a      ./obj/local/armeabi/libopencv_imgproc.a ./obj/local/armeabi/libopencv_highgui.a          ./obj/local/armeabi/libopencv_ml.a ./obj/local/armeabi/libopencv_legacy.a     ./obj/local/armeabi/libopencv_flann.a ./obj/local/armeabi/libopencv_core.a        ./obj/local/armeabi/libopencv_androidcamera.a ./obj/local/armeabi/liblibjpeg.a       ./obj/local/armeabi/liblibpng.a ./obj/local/armeabi/liblibtiff.a      ./obj/local/armeabi/liblibjasper.a ./obj/local/armeabi/libzlib.a       ./obj/local/armeabi/libgnustl_static.a    -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-      z,relro -Wl,-z,now  -LD:/android-ndk-r8b/platforms/android-14/arch-arm/usr/lib -llog -lc -           lm  -o obj/local/armeabi/libAvatarSpeak.so
./obj/local/armeabi/objs-debug/AvatarSpeak/AvatarSpeak.o: In function      `Java_com_hachi_avatar_AvatarSpeak_speak':
D:\eclipse_workspace\TestSo/jni/com_hachi_avatar_AvatarSpeak.cpp:52: undefined     reference to `Fap2Avi2D(char const*, char const*, char const*, char const*, char const*,    int)'
collect2: ld returned 1 exit status
/cygdrive/d/android-ndk-r8b/build/core/build-binary.mk:378: recipe for target     `obj/local/armeabi/libAvatarSpeak.so' failed
make: *** [obj/local/armeabi/libAvatarSpeak.so] Error 1

AvatarSpeak.cpp

if (fImage != NULL && fPot != NULL) {

bool sucavi = Fap2Avi2D(str3, str5, str4, str1, str2, -1);
LOGI("sucess and exit!");
} else {
LOGI("unsucess and exit!");
}

Animation2D_new.h(заголовочный файл, где определяют метод Fap2Avi2D)

#ifndef ANIMATION_2D_NEW_H_
#define ANIMATION_2D_NEW_H_

#include <vector>
#include <string>
#include "public.h"#include "FaceExpressionEditor.h"//#define  __declspec(dllexport)

bool Fap2Avi2D(const char *fap_file,const char *avi_file,const char *wav_file, const   char* image_file,const char *pot_file=NULL,int codec_type=-1);
...

1

Решение

Чаще всего «неопределенная ссылка» означает, что ваша сборка настроена неправильно. Например, непреднамеренный разрыв строки в Android.mk файл может вызвать делать инструмент выбрать неправильную команду ссылки для вашего проекта.

Обычно сообщение об ошибке включает имя отсутствующей функции или глобальной переменной и модуль (файл), который искал эту ссылку. Если имя не требует пояснений, вы часто можете найти это имя в исходном коде, а затем отследить его до одной из используемых вами внешних библиотек, потому что это, вероятно, объявленный в каком-то заголовке (.час или же .HPP) файлы, включенные в ваш источник.

Маловероятно, что вы непреднамеренно используете какую-то внешнюю библиотеку, которую вам нужно загрузить, потому что обычно такие ошибки проявляются раньше, когда компилятор не может найти необходимые файлы заголовков.

Один конкретный случай, когда собственные проекты Android отображают ошибки «неопределенная ссылка», — это когда в проекте используются неофициальные API-интерфейсы Android, например OpenMAX / stagefreight. В таких случаях файлы заголовков находятся в дереве исходного кода Android, но скомпилированные библиотеки, необходимые для фазы соединения, отсутствуют. Обычный обходной путь — извлечь двоичные файлы из вашего устройства разработки, например,

adb pull /system/lib/libstagefreight.so .

В любом случае, это часто помогает запустить ndk-build с V = 1 чтобы точно увидеть, какие команды сборки выполняются.

1

Другие решения

Не существует общего способа найти «недостающую библиотеку». Здесь ваши навыки программиста (и пользователя Google) должны быть активированы.

Первым делом всегда нужно определить, к какой библиотеке принадлежит функция. Использование Google всегда хорошая ставка.

Когда вы это знаете, вам нужно выяснить, установлена ​​ли эта библиотека в вашей системе. Если нет, сделайте это так.

Затем вам нужно добавить эту зависимость в вашу систему сборки. Как это сделать, зависит от среды и используемых инструментов. Google еще раз ваш лучший выбор.

0

По вопросам рекламы [email protected]