У меня ошибка «неопределенная ссылка на ___» при использовании Android NDK. Есть довольно много таких вопросов, как мой, но ни один не помог мне. Моей главной проблемой может быть понимание того, что не так, или моё незнание команд make-файла Android.mk.
Это самый первый вывод, когда я запускаю ndk-build. уведомление libProcessor.so, вызов функции для Изображение :: findTransform () в Image.cpp, и конечно неопределенная ссылка на ‘Matrix :: Matrix (int, int)«:
Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 15 in ./AndroidManifest.xml
[armeabi-v7a] SharedLibrary : libProcessor.so
/Applications/adt-bundle-mac-x86_64-20140702/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi-v7a/objs/Processor/Image.o: in function Image::findTransform(float, float, CGPoint, CGPoint, CGPoint, CGPoint, float&, float&, float&, float&, float&, float&, float&, float&):jni/Image.cpp:1230: error: undefined reference to 'Matrix::Matrix(int, int)'
Строка кода, на которую он жалуется, проста:
Matrix A(8,8);
Этот класс Matrix находится в файле исходного кода, а не в предварительно созданной библиотеке. Сначала у меня были ошибки компиляции для класса Matrix, но после включения файла newmat10.h все они исчезли, поэтому я знаю, что каталог newmat10 найден и весь его исходный код. Вот что меня озадачивает: файл исходного кода, который определяет класс Matrix, встраивается в libProcessor.so вместе с кодом Image.cpp, который его вызывает, так что еще нужно знать для разрешения ссылки? Возможно, проблема в моем файле Android.mk, который находится здесь:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Processor
LOCAL_SRC_FILES := Processor.cpp Image.cpp
LOCAL_LDLIBS := -llog
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/newmat10 \include $(BUILD_SHARED_LIBRARY)
Конечно, мне особенно нужно исправить эту ошибку, но я также очень хотел бы понять ее специфику. Система не говорит: «Я сейчас пытаюсь написать объектный файл Image.o и вижу объявление объекта Matrix, но я не знаю, куда я помещаю код для конструктора Matrix, когда я успешно скомпилировал Image. каст. «?
Таким образом, у вас нет исходных файлов для Matrix
включены в сборку. Если у вас есть несколько файлов, вместо того, чтобы перечислять их вручную, вы можете изменить Android.mk
как это:
LOCAL_SRC_FILES := Processor.cpp Image.cpp
LOCAL_SRC_FILES += $(foreach file, $(wildcard jni/newmat10/*.cpp), ../${file})