Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android中的OpenCV 4.0.1链接失败_Android_C++_Opencv_Linker - Fatal编程技术网

Android中的OpenCV 4.0.1链接失败

Android中的OpenCV 4.0.1链接失败,android,c++,opencv,linker,Android,C++,Opencv,Linker,我正在将OpenCV库从3.2.0迁移到4.0.1。在这个过程中发现很多宏已经被重新定义为更多的C++风格,如CVH-BGR2RGB,现在是CROUBIGBGR2RGB。 当前在尝试链接../native/libs/x86_64/libopencv_java4时遇到以下链接错误 native/jni/include\opencv2/core/mat.inl.hpp:548: error: undefined reference to 'cv::error(int, std::string con

我正在将OpenCV库从3.2.0迁移到4.0.1。在这个过程中发现很多宏已经被重新定义为更多的C++风格,如CVH-BGR2RGB,现在是CROUBIGBGR2RGB。 当前在尝试链接../native/libs/x86_64/libopencv_java4时遇到以下链接错误

native/jni/include\opencv2/core/mat.inl.hpp:548: error: undefined reference to 'cv::error(int, std::string const&, char const*, char const*, int)'

native/jni/include\opencv2/core/mat.inl.hpp:561: error: undefined reference to 'cv::error(int, std::string const&, char const*, char const*, int)'

xxx_std.h:355: error: undefined reference to 'cv::putText(cv::_InputOutputArray const&, std::string const&, cv::Point_<int>, int, double, cv::Scalar_<double>, int, int, bool)'

LabelUtils.cpp:1225: error: undefined reference to 'cv::putText(cv::_InputOutputArray const&, std::string const&, cv::Point_<int>, int, double, cv::Scalar_<double>, int, int, bool)'

LabelUtils.cpp:2512: error: undefined reference to 'cv::imwrite(std::string const&, cv::_InputArray const&, std::vector<int, std::allocator<int> > const&)'

TrackingCodeDeSkew.cpp:553: error: undefined reference to 'cv::putText(cv::_InputOutputArray const&, std::string const&, cv::Point_<int>, int, double, cv::Scalar_<double>, int, int, bool)'

TrackingCodeDeSkew.cpp:557: error: undefined reference to 'cv::putText(cv::_InputOutputArray const&, std::string const&, cv::Point_<int>, int, double, cv::Scalar_<double>, int, int, bool)'
native/jni/include\opencv2/core/mat.inl.hpp:548:错误:未定义对“cv::error(int,std::string const&,char const*,char const*,int)”的引用
native/jni/include\opencv2/core/mat.inl.hpp:561:错误:未定义对“cv::error(int,std::string const&,char const*,char const*,int)”的引用
xxx_std.h:355:错误:未定义对“cv::putText(cv:_inputOutputArrayconst&,std::string const&,cv::Point_,int,double,cv::Scalar_,int,int,bool)”的引用
LabelAboutILS.cpp:1225:错误:未定义对“cv::putText(cv:_InputOutputArray常量&,std::string常量&,cv::Point U1,int,double,cv::Scalar U2,int,int,bool)”的引用
labeludils.cpp:2512:错误:未定义对“cv::imwrite(std::string const&,cv:_inputarrayconst&,std::vector const&)”的引用
TrackingCodeDeSkew.cpp:553:错误:未定义对“cv::putText(cv:_InputOutPutArrayconst&,std::string const&,cv::Point_,int,double,cv::Scalar_,int,int,bool)”的引用
TrackingCodeDeSkew.cpp:557:错误:未定义对“cv::putText(cv:_InputOutPutArrayconst&,std::string const&,cv::Point_,int,double,cv::Scalar_,int,int,bool)”的引用
这是链接器命令行

    C:\Users\koush\AppData\Local\Android\Sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe  --target=x86_64-none-linux-android --gcc-toolchain=C:/Users/koush/AppData/Local/Android/Sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/windows-x86_64 --sysroot=C:/Users/koush/AppData/Local/Android/Sdk/ndk-bundle/sysroot -fPIC -isystem C:/Users/koush/AppData/Local/Android/Sdk/ndk-bundle/sysroot/usr/include/x86_64-linux-android -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat
<<list of generated object files>> -llog OpenCV401/native/libs/x86_64/libopencv_java4.so src/main/jniLibs/x86_64/libzbarjni.so src/main/jniLibs/x86_64/libiconv.so -landroid -latomic -lm "C:/Users/koush/AppData/Local/Android/Sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86_64/libsupc++.a" "C:/Users/koush/AppData/Local/Android/Sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86_64
/libgnustl_shared.so"
C:\Users\koush\AppData\Local\Android\Sdk\ndk bundle\toolschains\llvm\prebuilded\windows-x86\u 64\bin\clang++.exe--target=x86\u 64-none-linux-Android--gcc toolschain=C:/Users/koush/AppData/Local/Android/Sdk/ndk bundle/toolschains/x86\u 64-4.9/prebuilded/windows-x86\u 64-sysroot=C:/Users/koush/AppData/Local/Android/ndle/ndk bundle/sysroot-fPIC-isystem C:/Users/koush/AppData/Local/Android/Sdk/ndk bundle/sysroot/usr/include/x86\u 64-linux-Android-D\u-Android\u-API\u=21-g-DANDROID-ffunction sections-funwind表-fstack-protector-strong-无规范前缀-Wa,--noexecstack-Wformat
-llog OpenCV401/native/libs/x86_64/libopencv_java4.so src/main/jniLibs/x86_64/libzbarjni.so src/main/jniLibs/x86_64/libiconv.so-landroid-latomic-lm“C:/Users/koush/AppData/Local/Android/Sdk/ndk bundle/sources/cxx++/gnu libstdc++/4.9/libs/x86_64/libsupc.a”“C:/Users/koush/AppData/Local/Android/Sdk/ndk bundle/sources/cxx stl/gnu libstdc++/4.9/libs/x8664
/libgnustl_共享。所以“

首先,如果您考虑在任何时候切换回OpenCV 3 .x,您将需要向后兼容的标题,例如:


/*
 * OpenCV 4.0.1 backward compatibility header.
 * */

#ifndef ANDROID_DOXCAPTUREUI_OPENCV4_COMPAT_H
#define ANDROID_DOXCAPTUREUI_OPENCV4_COMPAT_H

#include <opencv2/opencv.hpp>
#include <cmath>

#if CV_MAJOR_VERSION > 3

// namespace cv;
//{
#ifndef CV_TERMCRIT_ITER
#define CV_TERMCRIT_ITER cv::TermCriteria::MAX_ITER
#endif

#ifndef CV_BGR2GRAY
#define CV_BGR2GRAY cv::COLOR_BGR2GRAY
#endif

#ifndef CV_BGR2RGB
#define CV_BGR2RGB cv::COLOR_BGR2RGB
#endif

#ifndef CV_RGB2GRAY
#define CV_RGB2GRAY cv::COLOR_RGB2GRAY
#endif

#ifndef CV_BGRA2GRAY
#define CV_BGRA2GRAY cv::COLOR_BGRA2GRAY
#endif

#ifndef CV_GRAY2RGBA
#define CV_GRAY2RGBA cv::COLOR_GRAY2RGBA
#endif

#ifndef CV_GRAY2RGB
#define CV_GRAY2RGB cv::COLOR_GRAY2RGB
#endif

#ifndef CV_GRAY2BGRA
#define CV_GRAY2BGRA cv::COLOR_GRAY2BGRA
#endif

#ifndef CV_GRAY2BGR565
#define CV_GRAY2BGR565 cv::COLOR_GRAY2BGR565
#endif

#ifndef CV_RGBA2BGR565
#define CV_RGBA2BGR565 cv::COLOR_RGBA2BGR565
#endif

#ifndef CV_RGBA2RGB
#define CV_RGBA2RGB cv::COLOR_RGBA2RGB
#endif

#ifndef CV_RGB2RGBA
#define CV_RGB2RGBA cv::COLOR_RGB2RGBA
#endif

#ifndef CV_RGB2BGR565
#define CV_RGB2BGR565 cv::COLOR_RGB2BGR565
#endif

#ifndef CV_RGBA2BGR
#define CV_RGBA2BGR cv::COLOR_RGBA2BGR
#endif

#ifndef CV_RGBA2GRAY
#define CV_RGBA2GRAY cv::COLOR_RGBA2GRAY
#endif

#ifndef CV_ADAPTIVE_THRESH_GAUSSIAN_C
#define CV_ADAPTIVE_THRESH_GAUSSIAN_C cv::ADAPTIVE_THRESH_GAUSSIAN_C
#endif

#ifndef CV_THRESH_BINARY
#define CV_THRESH_BINARY cv::THRESH_BINARY
#endif

#ifndef CV_BGR2HSV
#define CV_BGR2HSV cv::COLOR_BGR2HSV
#endif

#ifndef CV_BGR2Lab
#define CV_BGR2Lab cv::COLOR_BGR2Lab
#endif

#ifndef CV_RGB2HSV
#define CV_RGB2HSV cv::COLOR_RGB2HSV
#endif

#ifndef CV_HSV2RGB
#define CV_HSV2RGB cv::COLOR_HSV2RGB
#endif

#ifndef CV_THRESH_OTSU
#define CV_THRESH_OTSU cv::THRESH_OTSU
#endif


#ifndef CV_THRESH_BINARY
#define CV_THRESH_BINARY THRESH_BINARY
#endif

#ifndef CV_MOP_CLOSE
#define CV_MOP_CLOSE cv::MORPH_CLOSE
#endif

#ifndef CV_RETR_CCOMP
#define CV_RETR_CCOMP cv::RETR_CCOMP
#endif

#ifndef CV_RETR_LIST
#define CV_RETR_LIST cv::RETR_LIST
#endif

#ifndef CV_RETR_TREE
#define CV_RETR_TREE cv::RETR_TREE
#endif

#ifndef CV_RETR_FLOODFILL
#define CV_RETR_FLOODFILL cv::RETR_FLOODFILL
#endif

#ifndef CV_RETR_EXTERNAL
#define CV_RETR_EXTERNAL cv::RETR_EXTERNAL
#endif

#ifndef CV_CHAIN_APPROX_SIMPLE
#define CV_CHAIN_APPROX_SIMPLE cv::CHAIN_APPROX_SIMPLE
#endif

#ifndef CV_CHAIN_APPROX_TC89_KCOS
#define CV_CHAIN_APPROX_TC89_KCOS cv::CHAIN_APPROX_TC89_KCOS
#endif

#ifndef CV_FILLED
#define CV_FILLED cv::FILLED
#endif


#ifndef CV_REDUCE_SUM
#define CV_REDUCE_SUM cv::REDUCE_SUM
#endif

#ifndef CV_StsBadArg
#define CV_StsBadArg cv::Error::StsBadArg
#endif
//}

#ifndef cvFastArctan
#define cvFastArctan( Y, X )  ( std::atan2( (Y), (X) ) )
#endif

#endif //endif CV_MAJOR_VERSION

#endif //ANDROID_DOXCAPTUREUI_OPENCV4_COMPAT_H


由于时间不够,我已升级到3.4.5,它保留了类似于OpenCV 3.2.0的分发格式。未报告任何错误。@Yashin感谢您的回答,我将在返回时尝试一下。但有一个问题-我为什么要定义宏?这些方法在4.x中的方法是否已更改?一些宏名称已更改为th OpenCV 4.x(例如CV_BGR2HSV-->颜色_BGR2GRAY)。如果您有一个使用OpenCV 3.x编写的代码库,那么代码库中使用的某些宏将给出一个错误。此外,我在回答中附加的标题是一种黑客行为,我认为应该有更好的方法来支持向后兼容性,而不是定义宏。很高兴与大家分享使用OpenCV 4.2.0已有一段时间了。有不需要定义无关的宏。使用了新的命名样式,如@Yasin Yildirim概述的颜色_BGR2GRAY
    externalNativeBuild {
            cmake {
               //sample cpp flag parameters
                cppFlags "-std=c++14 -Ofast -Rpass-analysis=loop-vectorize -fsave-optimization-record -fdiagnostics-show-hotness"
           //sample abi filter parameters
                abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
    //set -DANDROID_STL to c++_shared
                arguments "-DANDROID_STL=c++_shared" 
            }
        }