Я скомпилировал статические библиотеки OpenCV для android armeabi-v7a.
Теперь я пытаюсь связать свой собственный код C++ с этими библиотеками через файл CMakeLists.txt в Android Studio, но это не удается с этой странной ошибкой:
~/opencv/modules/videoio/src/container_avi.cpp:0: error: undefined reference to 'stderr'
Этот код взят из libopencv_videoio.a
Интересная часть файла CMakeLists.txt - это
# linking with static libraries
target_link_libraries(native-lib
dnn ml objdetect shape stitching superres videostab calib3d features2d highgui videoio imgcodecs video photo imgproc flann core
)
Разве он не должен автоматически находить стандартные библиотеки?
РЕДАКТИРОВАТЬ 1: Ниже мой Application.mk
...
NDK_TOOLCHAIN_VERSION := clang
APP_PLATFORM := android-21
APP_STL := c++_shared
...
Версия NDK взята из Changelog.md: r17b
Обновлено еще раз:
Как предложил Дэн, я добавил
"-DANDROID_PLATFORM=android-24"
к аргументам cmake
Версия NDK вроде r17b
Application.mk ничего не делает для CMake.
CMake и ndk-build - это разные системы сборки ДВА для собственного кода Android. CMake - это рекомендуемая в настоящее время система сборки, но ndk-build - более старый способ. Нет никакого смысла в том, что у вас есть Application.mk
, если вы используете систему сборки CMake.
@shizhen, спасибо за это.
Наиболее вероятный сценарий состоит в том, что вы создали opencv для android-23 +, но у native-lib ниже minSdkVersion. См. https://android.googlesource.com/platform/ndk/+/master/docs/user/common_problems.md#using-mismatched-prebuilt-libraries.
Уловка заключалась в том, чтобы добавить "-DANDROID_PLATFORM = android-24" для компиляции моей собственной библиотеки.
Спасибо за комментарий Оливер, у меня тоже сработало, но для другого проекта
Какую версию NDK вы используете и на какой APP_PLATFORM вы нацеливаетесь (например,
android-21
)?