未定义对 Android NDK 的 cv::imwrite 的引用

undefined reference to 'cv::imwrite with Android NDK

提问人:Arthur Attout 提问时间:9/18/2019 最后编辑:Arthur Attout 更新时间:9/18/2019 访问量:465

问:

我正在使用 CMAKE 构建使用 OpenCV 的 OpenALPR。

我的CMakeLists.txt包含以下语句:

# Discover OpenCV directory automatically
find_path(OpenCV_DIR
    NAMES OpenCVConfig.cmake
    HINTS ${CMAKE_SOURCE_DIR}/../libraries/opencv/
    /storage/projects/alpr/libraries/opencv/
    )

# Opencv Package
FIND_PACKAGE( OpenCV REQUIRED )

#Some code omitted for clarity ...

 TARGET_LINK_LIBRARIES(alpr
    ${OPENALPR_LIB}
    ${STATE_DETECTION_LIB}
    support
    video
    ${OpenCV_LIBS}
    ${Tesseract_LIBRARIES}
    ${Extra_LIBS}
  )

CMake 不会抱怨任何事情,所以我假设找到了 OpenCV(另外,在我即将提到的错误之前,很多东西都是使用 OpenCV 构建的)。

我用来构建一切的指令:

cmake \
    -DANDROID_TOOLCHAIN=g++ \
    -DCMAKE_TOOLCHAIN_FILE=$NDK_ROOT/build/cmake/android.toolchain.cmake \
    -DANDROID_NDK=$NDK_ROOT \
    -DCMAKE_BUILD_TYPE=Release \
    -DANDROID_PLATFORM=$ANDROID_PLATFORM \
    -DANDROID_ABI="$i" \
    -DANDROID_STL=c++_shared \
    -DANDROID_CPP_FEATURES="rtti exceptions" \
    -DTesseract_INCLUDE_BASEAPI_DIR=$TESSERACT_SRC_DIR/api \
    -DTesseract_INCLUDE_CCSTRUCT_DIR=$TESSERACT_SRC_DIR/ccstruct \
    -DTesseract_INCLUDE_CCMAIN_DIR=$TESSERACT_SRC_DIR/ccmain \
    -DTesseract_INCLUDE_CCUTIL_DIR=$TESSERACT_SRC_DIR/ccutil \
    -DTesseract_LIB=$TESSERACT_LIB_DIR/libtess.so \
    -DLeptonica_LIB=$TESSERACT_LIB_DIR/liblept.so \
    -DOpenCV_DIR=$SCRIPTPATH/../OpenCV-android-sdk/sdk/native/jni \
    -DJAVA_AWT_LIBRARY=$JAVA_AWT_LIBRARY \
    -DJAVA_JVM_LIBRARY=$JAVA_JVM_LIBRARY \
    -DJAVA_INCLUDE_PATH=$JAVA_INCLUDE_PATH \
    -DJAVA_INCLUDE_PATH2=$JAVA_INCLUDE_PATH2 \
    -DJAVA_AWT_INCLUDE_PATH=$JAVA_AWT_INCLUDE_PATH \
    -DPngt_LIB=$TESSERACT_LIB_DIR/libpngt.so \
    -DJpgt_LIB=$TESSERACT_LIB_DIR/libjpgt.so \
    -DJnigraphics_LIB=$NDK_ROOT/platforms/$ANDROID_PLATFORM/arch-$arch/usr/$lib/libjnigraphics.so \
    -DANDROID_ARM_MODE=arm \
    ../../src/

请注意,我使用的是 Android OpenCV SDK v3.4.3。我有一个未定义的错误:

openalpr/src/misc_utilities/prepcharsfortraining.cpp:224: error: undefined reference to 'cv::imwrite(cv::String const&, cv::_InputArray const&, std::__ndk1::vector<int, std::__ndk1::allocator<int> > const&)'

有罪文件具有以下包含语句:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>
#include <stdio.h>
#include <fstream>
#include <sys/stat.h>
#include "support/filesystem.h"
#include "../tclap/CmdLine.h"
#include "support/utf8.h"

using namespace std;
using namespace cv;
using namespace alpr;

我不明白为什么找不到 imwrite。我尝试过使用 Android NDK 20、19、16 和 14,但没有运气

opencv 未定义引用

评论

0赞 Arthur Attout 9/19/2019
似乎我必须在某个地方添加,但是在使用Cmake时我不知道将此选项放在哪里。-lopencv_imgcodecs
0赞 rayryeng 7/8/2020
您需要修改 CMake 文件才能执行此操作:stackoverflow.com/questions/11783932/...

答: 暂无答案