【问题标题】:Compiling Qt and OpenCV for arm64-v8a为 arm64-v8a 编译 Qt 和 OpenCV
【发布时间】:2018-12-21 12:31:40
【问题描述】:

我正在尝试使用 Qt 和 OpenCV 为 arm64-v8a 编译程序 我创建了一个工具包来使用 Qt 的 arm64-v8a 版本,但我得到了大量未定义的引用错误

我使用以下参数编译了 Qt:

./configure -xplatform android-clang \
 --disable-rpath -nomake tests -nomake examples \
 -android-ndk <ndk-r16b-root> -android-sdk <sdk-root> -android-ndk-host linux-x86_64 \
 -android-toolchain-version 4.9 -android-ndk-platform android-21 -android-arch arm64-v8a \
 -skip qttranslations -skip qtserialport -skip qtwebengine -no-warnings-are-errors \
 -prefix <install-dir> -opensource -confirm-license

然后我添加了 2 个编译器,第一个用于 C,第二个用于 C++:

<ndk-r16b-root>/toolchains/llvm/prebuilt/linux-x86_64/bin/clang

使用 ABI: arm-linux-android-elf-64-bit

<ndk-r16b-root>/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++

使用 ABI: arm-linux-android-elf-64-bit

我为此版本的 Qt 克隆了自动检测工具包并使用了以下设置:

Device type : Android Device
Device : Run on Android (default for Android)
Sysroot : <ndk-r16b-root>/platforms/android-21/arch-arm64
Compilers : the 2 above
Android GDB server : <ndk-r16b-root>/prebuilt/android-arm64/gdbserver/gdbserver
Qt version : the one I just compiled
Qt mkspec : android-clang

其他字段默认为空

我的 .pro 文件如下所示:

QT += quick multimedia multimediawidgets
CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

HEADERS += <my-headers>
SOURCES += <my-sources>

RESOURCES += qml/qml.qrc

INCLUDEPATH += OpenCV-android-sdk/sdk/native/jni/include

LIBS += -L"OpenCV-android-sdk/sdk/native/3rdparty/libs/arm64-v8a"\
        -L"OpenCV-android-sdk/sdk/native/libs/arm64-v8a"\
        -llibtiff\
        -llibjpeg\
        -llibjasper\
        -llibpng\
        -lIlmImf\
        -llibwebp\
        -lopencv_core\
        -ltbb\
        -lopencv_flann\
        -lopencv_imgproc\
        -lopencv_highgui\
        -lopencv_features2d\
        -lopencv_calib3d\
        -lopencv_ml\
        -lopencv_objdetect\
        -lopencv_video\
        -lopencv_photo\
        -lopencv_videostab\
        -ltegra_hal\
        -lopencv_imgcodecs\
        -lopencv_shape\
        -lopencv_stitching\
        -lopencv_superres\
        -lopencv_videoio

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

DISTFILES += \
    android/AndroidManifest.xml \
    android/gradle/wrapper/gradle-wrapper.jar \
    android/gradlew \
    android/res/values/libs.xml \
    android/build.gradle \
    android/gradle/wrapper/gradle-wrapper.properties \
    android/gradlew.bat

ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android

OpenCV-android-sdk 文件夹来自 here 使用 3.2.0 Android 包。

当我尝试编译时,我得到大量未定义的引用,如下所示:

OpenCV-android-sdk/sdk/native/libs/arm64-v8a/libopencv_core.a(matrix.cpp.o): In function `cv::SparseMat::newNode(int const*, unsigned long)':
matrix.cpp:(.text._ZN2cv9SparseMat7newNodeEPKim+0x4b8): undefined reference to `std::__throw_length_error(char const*)'
OpenCV-android-sdk/sdk/native/libs/arm64-v8a/libopencv_core.a(matrix.cpp.o): In function `std::vector<cv::Mat, std::allocator<cv::Mat> >::_M_fill_insert(__gnu_cxx::__normal_iterator<cv::Mat*, std::vector<cv::Mat, std::allocator<cv::Mat> > >, unsigned long, cv::Mat const&)':
matrix.cpp:(.text._ZNSt6vectorIN2cv3MatESaIS1_EE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPS1_S3_EEmRKS1_[_ZNSt6vectorIN2cv3MatESaIS1_EE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPS1_S3_EEmRKS1_]+0xcd4): undefined reference to `std::__throw_length_error(char const*)'
OpenCV-android-sdk/sdk/native/libs/arm64-v8a/libopencv_core.a(matrix.cpp.o): In function `std::vector<cv::UMat, std::allocator<cv::UMat> >::_M_fill_insert(__gnu_cxx::__normal_iterator<cv::UMat*, std::vector<cv::UMat, std::allocator<cv::UMat> > >, unsigned long, cv::UMat const&)':
matrix.cpp:(.text._ZNSt6vectorIN2cv4UMatESaIS1_EE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPS1_S3_EEmRKS1_[_ZNSt6vectorIN2cv4UMatESaIS1_EE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPS1_S3_EEmRKS1_]+0xbb0): undefined reference to `std::__throw_length_error(char const*)'

实际使用的链接器命令(发生错误的地方)是:

<ndk-r16b-root>/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ -D__ANDROID_API__=26 -target aarch64-none-linux-android -gcc-toolchain <ndk-r16b-root>/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64 -Wl,--exclude-libs,libgcc.a --sysroot=<ndk-r16b-root>/platforms/android-26/arch-arm64/ -Wl,-soname,libTest.so -Wl,-rpath-link=<newly-compiled-Qt-root>/lib -Wl,--no-undefined -Wl,-z,noexecstack -shared -o libTest.so myfilter.o qml_main_qml.o qmlcache_loader.o   -L<ndk-r16b-root>/sources/cxx-stl/llvm-libc++/libs/arm64-v8a -LOpenCV-android-sdk/sdk/native/3rdparty/libs/arm64-v8a -LOpenCV-android-sdk/sdk/native/libs/arm64-v8a -llibtiff -llibjpeg -llibjasper -llibpng -lIlmImf -llibwebp -lopencv_core -ltbb -lopencv_flann -lopencv_imgproc -lopencv_highgui -lopencv_features2d -lopencv_calib3d -lopencv_ml -lopencv_objdetect -lopencv_video -lopencv_photo -lopencv_videostab -ltegra_hal -lopencv_imgcodecs -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videoio -L<newly-compiled-Qt-root>/lib -lQt5Quick -lQt5MultimediaWidgets -lQt5Multimedia -lQt5Widgets -lQt5Gui -lQt5Qml -lQt5Network -lQt5Core -lGLESv2 -lc++ -llog -lz -lm -ldl -lc

编辑:尝试自己编译 OpenCV,效果不佳。
Edit2:我刚刚看到Petesh 那里的答案:https://stackoverflow.com/a/12920944/9987834
这可能是因为我的 Qt 和 OpenCV 版本是使用不同的标准库编译的吗?
Edit3:无法正确编译 OpenCV,我收到类似这样的错误:

skipping incompatible /usr/local/lib/libopencv_core.a when searching for -lopencv_core

Edit4:出于某种原因,OpenCV 完全停止编译,给我这样的错误:

In file included from /path/to/opencv-3.2.0/modules/core/src/algorithm.cpp:43:
In file included from /path/to/opencv-3.2.0/modules/core/src/precomp.hpp:84:
In file included from /path/to/opencv-3.2.0/modules/core/include/opencv2/core/hal/intrin.hpp:297:
/path/to/opencv-3.2.0/modules/core/include/opencv2/core/hal/intrin_neon.hpp:285:49: error: expected
      unqualified-id
template <typename T> static inline float16x4_t vld1_f16(const T* ptr)
                                                ^
<ndk-r16b-root>/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/5.0.300080/include/arm_neon.h:7745:24: note:
      expanded from macro 'vld1_f16'
#define vld1_f16(__p0) __extension__ ({ \
                       ^
[ 31%] Built target libwebp
[ 31%] Building CXX object modules/core/CMakeFiles/opencv_core.dir/src/command_line_parser.cpp.o
In file included from /path/to/opencv-3.2.0/modules/core/src/algorithm.cpp:43:
In file included from /path/to/opencv-3.2.0/modules/core/src/precomp.hpp:84:
In file included from /path/to/opencv-3.2.0/modules/core/include/opencv2/core/hal/intrin.hpp:297:
/path/to/opencv-3.2.0/modules/core/include/opencv2/core/hal/intrin_neon.hpp:778:8: error: unknown type
      name 'v_float16x4'; did you mean 'v_float32x4'?
inline v_float16x4 v_load_f16(const short* ptr)
       ^~~~~~~~~~~
       v_float32x4

我的蛋糕(gui)输出在这里:https://pastebin.com/ZBrtizUi

有人知道为什么吗?

【问题讨论】:

    标签: android c++ qt opencv arm64


    【解决方案1】:

    即使回复晚了,我的评论也可能会帮助其他用户更新已弃用的 Android 项目...

    这是我输入的 CMake 命令(配置的变量在链接的日志文件中有详细说明): cmake ${OPENCV_CMAKEFILE} -DCMAKE_TOOLCHAIN_FILE=${ANDROID_TOOLCHAIN_FILE} -DANDROID_NDK=${ANDROID_NDK_PATH} -DANDROID_NATIVE_API_LEVEL=android-25 -DBUILD_JAVA=OFF -DBUILD_ANDROID_EXAMPLES=ON -DBUILD_ANDROID_PROJECTS=ON-DANDROID_STL=c++_static -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX:PATH=${OPENCV_INSTALL_PATH} -DANDROID_ABI=arm64-v8a -DCMAKE_BUILD_TYPE=Release

    1。 根据您的设置,当使用 OpenCV 4.5.3 启用 FP16 支持时,CMake 日志会显示:

    • 执行并验证了测试“HAVE_CPU_NEON_SUPPORT”(执行检查文件“cmake/checks/cpu_neon.cpp”)
    • 测试“HAVE_CPU_FP16_SUPPORT”已执行并验证(执行检查文件“cmake/checks/cpu_fp16.cpp”)
    • 并且生成的已识别 CPU/HW 功能基线被识别为“NEON FP16”(请参阅​​the linked logfile)。

    最后,库和示例应用程序构建成功。

    2。 根据您的设置,当使用 OpenCV 3.2.0 启用 FP16 支持时,CMake 日志会显示:

    • 已执行并验证测试“CXX_HAS_MFPU_NEON”
    • 已执行并验证测试“C_HAS_MFPU_NEON”
    • 检查文件“cmake/checks/fp16.cpp”被忽略。

    最后,库和示例应用程序没有成功构建(与您描述的错误相同)。我链接了键入的命令和CMake configuration logscompilation error logs我终于禁用了 FP16 支持并成功重建了 OpenCV 3.2.0。 Prebuilts are accessible here.

    根据我的调查,在 3.2.0 版本之后,似乎在 FP16 编译器对 OpenCV 的支持方面取得了一些进展。 6 月 21 日的This merge 是关于这个问题的最新工作,@alalek 的评论介绍了一些以前的拉取请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      相关资源
      最近更新 更多