Kesalahan linker Android Studio NDK referensi tidak terdefinisi ke 'cv::_OutputArray::_OutputArray(cv::Mat&)'

Saya sedang mengerjakan proyek Android yang menggunakan NDK, di mana saya telah menggunakan opencv untuk beberapa hal pengambilan dan efek gambar. Begini tampilan Android.mk saya:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

include path/to/OpenCV.mk

LOCAL_MODULE    := Scanner

LOCAL_SRC_FILES := scan.cpp

LOCAL_LDLIBS    += -lz -lm -llog -landroid -ldl -lstdc++

LOCAL_LDFLAGS +=  -ljnigraphics -fexceptions -std=c++11 -L$(LOCAL_PATH)/sdk/native/jni/libs/armeabi-v7a -L$(LOCAL_PATH)/sdk/native/jni/3rdparty/libs/armeabi-v7a -I$(LOCAL_PATH)/sdk/native/jni/include -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2/core -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2/calib3d -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2/contrib -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2/features2d -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2/flann -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2/highgui -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2/imgproc -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2/legacy -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2/ml -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2/objdetect -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2/ocl -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2/photo -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2/stitching -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2/superres -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2/ts -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2/video -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2/videostab -I$(LOCAL_PATH)/sdk/native/jni/include/opencv2

LOCAL_STATIC_LIBRARIES := opencv_shape opencv_stitching opencv_objdetect opencv_superres opencv_videostab opencv_calib3d opencv_features2d opencv_highgui opencv_videoio opencv_imgcodecs opencv_video opencv_photo opencv_ml opencv_flann opencv_imgproc opencv_core opencv_ts IlmImf libjasper libjpeg libpng libtiff libwebp tbb

include $(BUILD_SHARED_LIBRARY)

Meskipun saya menautkan semua perpustakaan opencv dan menentukan jalur yang benar (memverifikasinya dengan mengubah jalur), saya mendapatkan kesalahan tautan berikut:

../sdk/native/jni/include/opencv2/core/mat.hpp:335: error: undefined reference to 'cv::_OutputArray::_OutputArray(cv::Mat&)'
jni/scan.cpp:33: error: undefined reference to 'cv::_InputArray::_InputArray(cv::Mat const&)'
jni/scan.cpp:33: error: undefined reference to 'cv::_OutputArray::_OutputArray(cv::Mat&)'
jni/scan.cpp:65: error: undefined reference to 'cv::_InputArray::_InputArray(cv::Mat const&)'
jni/scan.cpp:65: error: undefined reference to 'cv::_InputArray::_InputArray(cv::Mat const&)'
jni/scan.cpp:72: error: undefined reference to 'cv::_InputArray::_InputArray(cv::Mat const&)'
jni/scan.cpp:48: error: undefined reference to 'cv::_OutputArray::_OutputArray(cv::Mat&)'
jni/scan.cpp:51: error: undefined reference to 'cv::_OutputArray::_OutputArray(cv::Mat&)'
jni/scan.cpp:58: error: undefined reference to 'cv::findContours(cv::_OutputArray const&, cv::_OutputArray const&, int, int, cv::Point_<int>)'
..sdk/native/jni/include/opencv2/core/mat.hpp:276: error: undefined reference to 'vtable for cv::_OutputArray'
..Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: the vtable symbol may be undefined because the class is missing its key function
..sdk/native/jni/include/opencv2/core/mat.hpp:276: error: undefined reference to 'vtable for cv::_OutputArray'
..Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: the vtable symbol may be undefined because the class is missing its key function
jni/scan.cpp:162: error: undefined reference to 'cv::findContours(cv::_OutputArray const&, cv::_OutputArray const&, int, int, cv::Point_<int>)'
..sdk/native/jni/include/opencv2/core/mat.hpp:276: error: undefined reference to 'vtable for cv::_OutputArray'
/Users/mtsindia/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: the vtable symbol may be undefined because the class is missing its key function
..sdk/native/jni/include/opencv2/core/mat.hpp:276: error: undefined reference to 'vtable for cv::_OutputArray'
..Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: the vtable symbol may be undefined because the class is missing its key function
jni/scan.cpp:261: error: undefined reference to 'vtable for cv::_InputArray'
..Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: the vtable symbol may be undefined because the class is missing its key function
jni/scan.cpp:296: error: undefined reference to 'cv::Exception::Exception(int, std::string const&, std::string const&, std::string const&, int)'
jni/scan.cpp:297: error: undefined reference to 'cv::Exception::Exception(int, std::string const&, std::string const&, std::string const&, int)'
jni/scan.cpp:298: error: undefined reference to 'cv::Exception::Exception(int, std::string const&, std::string const&, std::string const&, int)'
jni/scan.cpp:299: error: undefined reference to 'cv::Exception::Exception(int, std::string const&, std::string const&, std::string const&, int)'

Ini adalah tautan tempat saya mengunduh demo aplikasi pemindai dan membuat modifikasi pada file scan.cpp dan mencoba membangun kembali perpustakaan. Saya telah membuat ndk-build sebagai alat eksternal di Android studio, memverifikasi jalur ndk juga. Apa yang kulewatkan di sini? Bantuan apa pun akan dihargai.


person Karthik Sivam    schedule 20.12.2017    source sumber
comment
Menurutku -lstdc++ tidak boleh digunakan.   -  person Alex Cohn    schedule 21.12.2017
comment
LOCAL_STATIC_LIBRARIES += dengan + bukannya :   -  person Alex Cohn    schedule 21.12.2017
comment
@AlexCohn Terima kasih. Mencoba keduanya tetapi saya masih mendapatkan kesalahan yang sama.   -  person Karthik Sivam    schedule 21.12.2017


Jawaban (1)


Memperbaikinya. Saya tidak tahu alasan pasti bagaimana hal itu diperbaiki. Saya mengembalikan semua perubahan yang saya buat di Android.mk, Application.mk dan OpenCV.mk, Sekarang Adnroid.mk saya terlihat seperti ini:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
OPENCV_INSTALL_MODULES:=on
include $(LOCAL_PATH)/sdk/native/jni/OpenCV.mk

LOCAL_MODULE    := Scanner
LOCAL_SRC_FILES := scan.cpp
LOCAL_LDLIBS    += -lm -llog -landroid
LOCAL_LDFLAGS += -ljnigraphics
include $(BUILD_SHARED_LIBRARY)

Dan Aplikasi.mk:

APP_STL := stlport_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := all
APP_PLATFORM := android-14

Dan inilah tampilan OpenCV.mk saya:

https://pastebin.com/zuqM6tbu

Saya kira saya melewatkan menentukan jalur yang benar atau file perpustakaan saya (.so dan .a) mungkin memiliki versi yang berbeda dari file header yang disertakan. Jika ada yang punya ide lain, silakan kirim komentar.

person Karthik Sivam    schedule 21.12.2017
comment
Bagus. Perhatikan bahwa OpenCV mengharapkan APP_STL=gnustl_static. Sebenarnya, ini adalah pilihan yang lebih baik daripada stlport dalam banyak kasus. - person Alex Cohn; 21.12.2017