OpenCV使用CMake和MinGW-w64的编译安装

2023-05-16

前言

之前写过的一篇博文:OpenCV使用CMake和MinGW的编译安装及其在Qt配置运行 是使用 32 位的 MinGW 在 Windows 下编译 OpenCV 生成 32 位的 dll。

而这篇博文是使用 64 位的 MinGW 编译 OpenCV 生成 64 位的 dll。

因为博主没有 64 位 qmake,所以没勾选 WITH_QT

编译好的 OpenCV(MinGW 版):

Github . huihut/OpenCV-MinGW-Build

软件环境

  • Windows-10-64bit
  • MinGW-x64-4.8.1-release-posix-seh-rev5
  • CMake-3.12.0
  • OpenCV-3.4.1 | OpenCV-4.0.0-alpha | OpenCV-4.0.0-rc | OpenCV-4.1.0

安装 MinGW-w64 并配置环境变量

下载安装:MinGW-x64-4.8.1-release-posix-seh-rev5

(博文使用 MinGW-x64-4.8.1 为例,但建议使用最新 MinGW:MinGW-w64 - for 32 and 64 bit Windows)

为用户变量 Path 添加 E:\MinGW-w64\x64-4.8.1-release-posix-seh-rev5\mingw64\bin

使环境变量生效

打开命令提示符 CMD,运行 set PATH=C:,更改当前窗口任务的环境变量,关闭这个 CMD。

再次打开另一个 CMD,运行 echo %PATH%,显示最新的环境变量,会发现刚刚添加的 MinGW 环境变量已经生效。

使用 CMake 生成 OpenCV 的 Makefile

打开 cmake-gui,设置源码和生成路径:

  • Where is the source code: E:/opencv_341/opencv/sources
  • Where to build the binaries: E:/opencv_341/opencv_mingw64_build

点击 Configure,设置编译器

  • Specify the generator for this project: MinGW Makefiles
  • Specify native compilers
  • Next
  • Compilers C: E:\MinGW-w64\x64-4.8.1-release-posix-seh-rev5\mingw64\bin\gcc.exe
  • Compilers C++: E:\MinGW-w64\x64-4.8.1-release-posix-seh-rev5\mingw64\bin\g++.exe
  • Finish

编译配置:

  • 勾选 WITH_OPENGL
  • 勾选 ENABLE_CXX11
  • 不勾选 WITH_IPP
  • 不勾选 ENABLE_PRECOMPILED_HEADERS

点击 Configure,Generate 生成 Makefile

博主的配置信息如下:

General configuration for OpenCV 3.4.1 =====================================
  Version control:               unknown

  Platform:
    Timestamp:                   2018-07-31T02:14:11Z
    Host:                        Windows 10.0.17134 AMD64
    CMake:                       3.12.0
    CMake generator:             MinGW Makefiles
    CMake build tool:            E:/MinGW-w64/x64-4.8.1-release-posix-seh-rev5/mingw64/bin/mingw32-make.exe
    Configuration:               Release

  CPU/HW features:
    Baseline:                    SSE SSE2 SSE3
      requested:                 SSE3
    Dispatched code generation:  SSE4_1 SSE4_2 FP16 AVX AVX2
      requested:                 SSE4_1 SSE4_2 AVX FP16 AVX2 AVX512_SKX
      SSE4_1 (3 files):          + SSSE3 SSE4_1
      SSE4_2 (1 files):          + SSSE3 SSE4_1 POPCNT SSE4_2
      FP16 (2 files):            + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 AVX
      AVX (5 files):             + SSSE3 SSE4_1 POPCNT SSE4_2 AVX
      AVX2 (9 files):            + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2

  C/C++:
    Built as dynamic libs?:      YES
    C++11:                       YES
    C++ Compiler:                E:/MinGW-w64/x64-4.8.1-release-posix-seh-rev5/mingw64/bin/g++.exe  (ver 4.8.1)
    C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -Wno-long-long -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG
    C++ flags (Debug):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -Wno-long-long -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -g  -O0 -DDEBUG -D_DEBUG
    C Compiler:                  E:/MinGW-w64/x64-4.8.1-release-posix-seh-rev5/mingw64/bin/gcc.exe
    C flags (Release):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-narrowing -Wno-comment -fdiagnostics-show-option -Wno-long-long -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -O3 -DNDEBUG  -DNDEBUG
    C flags (Debug):             -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-narrowing -Wno-comment -fdiagnostics-show-option -Wno-long-long -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -g  -O0 -DDEBUG -D_DEBUG
    Linker flags (Release):      -Wl,--gc-sections  
    Linker flags (Debug):        -Wl,--gc-sections  
    ccache:                      NO
    Precompiled headers:         NO
    Extra dependencies:          opengl32 glu32
    3rdparty dependencies:

  OpenCV modules:
    To be built:                 calib3d core dnn features2d flann highgui imgcodecs imgproc java_bindings_generator ml objdetect photo python_bindings_generator shape stitching superres ts video videoio videostab
    Disabled:                    js world
    Disabled by dependency:      -
    Unavailable:                 cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev java python2 python3 viz
    Applications:                tests perf_tests apps
    Documentation:               NO
    Non-free algorithms:         NO

  Windows RT support:            NO

  GUI: 
    Win32 UI:                    YES
    OpenGL support:              YES (opengl32 glu32)
    VTK support:                 NO

  Media I/O: 
    ZLib:                        build (ver 1.2.11)
    JPEG:                        build (ver 90)
    WEBP:                        build (ver encoder: 0x020e)
    PNG:                         build (ver 1.6.34)
    TIFF:                        build (ver 42 - 4.0.9)
    JPEG 2000:                   build (ver 1.900.1)
    OpenEXR:                     build (ver 1.7.1)

  Video I/O:
    Video for Windows:           YES
    DC1394:                      NO
    FFMPEG:                      YES (prebuilt binaries)
      avcodec:                   YES (ver 57.107.100)
      avformat:                  YES (ver 57.83.100)
      avutil:                    YES (ver 55.78.100)
      swscale:                   YES (ver 4.8.100)
      avresample:                YES (ver 3.7.0)
    GStreamer:                   NO
    DirectShow:                  YES

  Parallel framework:            none

  Trace:                         YES (built-in)

  Other third-party libraries:
    Lapack:                      NO
    Eigen:                       NO
    Custom HAL:                  NO
    Protobuf:                    build (3.5.1)

  NVIDIA CUDA:                   NO

  OpenCL:                        YES (no extra features)
    Include path:                E:/opencv_341/opencv/sources/3rdparty/include/opencl/1.2
    Link libraries:              Dynamic load

  Python (for build):            E:/Python37-32/python.exe

  Java:                          
    ant:                         NO
    JNI:                         C:/Program Files (x86)/Java/jdk1.8.0_181/include C:/Program Files (x86)/Java/jdk1.8.0_181/include/win32 C:/Program Files (x86)/Java/jdk1.8.0_181/include
    Java wrappers:               NO
    Java tests:                  NO

  Matlab:                        NO

  Install to:                    E:/opencv_341/opencv_mingw64_build/install
-----------------------------------------------------------------

Configuring done
Generating done

编译 OpenCV

打开终端进行编译:(-j 是使用 8 个线程进行编译,请根据你的计算机配置合理设置线程数)

E:
cd E:\opencv_341\opencv_mingw64_build
mingw32-make -j 8
mingw32-make install

如果 mingw32-make -j 8 遇到错误,请看下面的 编译 OpenCV 常见错误,否则执行 mingw32-make install,完成安装。

编译 OpenCV 常见错误

1. MinGW-w64 的 aviriff.h 文件注释错误

表现

[ 49%] Building CXX object modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_dshow.cpp.obj
In file included from E:\opencv_341\opencv\sources\modules\videoio\src\cap_dshow.cpp:113:0:
e:\mingw-w64\x64-4.8.1-release-posix-seh-rev5\mingw64\x86_64-w64-mingw32\include\aviriff.h:2:8: error: expected constructor, destructor, or type conversion before 'file'
 * This file is part of the mingw-w64 runtime package.
        ^
e:\mingw-w64\x64-4.8.1-release-posix-seh-rev5\mingw64\x86_64-w64-mingw32\include\aviriff.h:3:25: error: 'refer' does not name a type
 * No warranty is given; refer to the file DISCLAIMER within this package.
                         ^
In file included from e:\mingw-w64\x64-4.8.1-release-posix-seh-rev5\mingw64\x86_64-w64-mingw32\include\aviriff.h:19:0,
                 from E:\opencv_341\opencv\sources\modules\videoio\src\cap_dshow.cpp:113:
e:\mingw-w64\x64-4.8.1-release-posix-seh-rev5\mingw64\x86_64-w64-mingw32\include\pshpack2.h:7:21: error: expected declaration before end of line
 #pragma pack(push,2)
                     ^
modules\videoio\CMakeFiles\opencv_videoio.dir\build.make:146: recipe for target 'modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_dshow.cpp.obj' failed
mingw32-make[2]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_dshow.cpp.obj] Error 1
CMakeFiles\Makefile2:3057: recipe for target 'modules/videoio/CMakeFiles/opencv_videoio.dir/all' failed
mingw32-make[1]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/all] Error 2
Makefile:161: recipe for target 'all' failed
mingw32-make: *** [all] Error 2

MinGW-w64_aviriff.h_file_annotation_error

解决

打开E:\MinGW-w64\x64-4.8.1-release-posix-seh-rev5\mingw64\x86_64-w64-mingw32\include\aviriff.h

发现第一行的多行注释少了个/符号,加上保存,如下:

/**
* This file is part of the mingw-w64 runtime package.
* No warranty is given; refer to the file DISCLAIMER within this package.
*/

然后重新 Configure-Generate-mingw32-make 就好了。

2. cap_msmf.cpp capture code 错误【2018年10月13日修改,因编译 OpenCV-4.0.0-alpha 时遇到并解决】

表现

......
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\videoio\src\cap_msmf.cpp: In member function 'HRESULT {anonymous}::ComPtr<T>::As({anonymous}::ComPtr<U>&) const [with U = IMF2DBuffer; T = IMFMediaBuffer; HRESULT = long int]':
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\videoio\src\cap_msmf.cpp:172:5: error: control reaches end of non-void function [-Werror=return-type]
     }
     ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\videoio\src\cap_msmf.cpp: In member function 'T* {anonymous}::ComPtr<T>::operator->() const [with T = IMF2DBuffer]':
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\videoio\src\cap_msmf.cpp:149:5: error: control reaches end of non-void function [-Werror=return-type]
     }
     ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\videoio\src\cap_msmf.cpp: In member function 'T* {anonymous}::ComPtr<T>::operator->() const [with T = IMFMediaBuffer]':
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\videoio\src\cap_msmf.cpp:149:5: error: control reaches end of non-void function [-Werror=return-type]
     }
     ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\videoio\src\cap_msmf.cpp: In member function 'T* {anonymous}::ComPtr<T>::operator->() const [with T = IMFSinkWriter]':
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\videoio\src\cap_msmf.cpp:149:5: error: control reaches end of non-void function [-Werror=return-type]
     }
     ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\videoio\src\cap_msmf.cpp: In member function 'T* {anonymous}::ComPtr<T>::Get() const [with T = IMFMediaBuffer]':
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\videoio\src\cap_msmf.cpp:158:5: error: control reaches end of non-void function [-Werror=return-type]
     }
     ^
cc1plus.exe: some warnings being treated as errors
modules\videoio\CMakeFiles\opencv_videoio.dir\build.make:188: recipe for target 'modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_msmf.cpp.obj' failed
mingw32-make[2]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_msmf.cpp.obj] Error 1
CMakeFiles\Makefile2:2556: recipe for target 'modules/videoio/CMakeFiles/opencv_videoio.dir/all' failed
mingw32-make[1]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/all] Error 2
mingw32-make[1]: *** Waiting for unfinished jobs....
[ 58%] Linking CXX shared library ..\..\bin\libopencv_dnn400.dll
[ 59%] Built target opencv_dnn
Makefile:161: recipe for target 'all' failed
mingw32-make: *** [all] Error 2

原因

因为 MinGW 不能编译 OpenCV 的 cap_msmf 那部分代码,具体见我提的 Issue:Failed to compile opencv-4.0.0-alpha using mingw-w64。

解决

所以,在 cmake-gui 编译配置中:

  • 不勾选 WITH_MSMF

然后重新 Configure-Generate-mingw32-make

3. ‘M_PI’ was not declared in this scope 错误【2018年10月13日修改,因编译 OpenCV-4.0.0-alpha 时遇到并解决】

表现

[ 86%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/chessboard.cpp.obj
In file included from E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp:7:0:
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.hpp: In constructor 'cv::details::FastX::Parameters::Parameters()':
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.hpp:35:36: error: 'M_PI' was not declared in this scope
                 resolution = float(M_PI*0.25);
                                    ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp: At global scope:
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp:25:42: error: 'M_PI' was not declared in this scope
 const float MAX_ANGLE = float(48.0/180.0*M_PI);          // max angle between line segments supposed to be straight
                                          ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp:26:48: error: 'M_PI' was not declared in this scope
 const float MIN_COS_ANGLE = float(cos(35.0/180*M_PI));   // min cos angle between board edges
                                                ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp:29:35: error: 'M_PI' was not declared in this scope
 const float RAD2DEG = float(180.0/M_PI);
                                   ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp: In function 'int cv::details::testPointSymmetry(cv::Mat, cv::Point2f, float, float)':
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp:217:33: error: 'M_PI' was not declared in this scope
     for(double angle=0;angle <= M_PI;angle+=M_PI*0.1)
                                 ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp: In member function 'void cv::details::FastX::rotate(float, const cv::Mat&, cv::Size, cv::Mat&) const':
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp:287:110: error: 'M_PI' was not declared in this scope
         cv::Mat m = cv::getRotationMatrix2D(cv::Point2f(float(img.cols*0.5),float(img.rows*0.5)),float(angle/M_PI*180),1);
                                                                                                              ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp: In member function 'std::vector<std::vector<float> > cv::details::FastX::calcAngles(const std::vector<cv::Mat>&, std::vector<cv::KeyPoint>&) const':
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp:393:30: error: 'M_PI' was not declared in this scope
     float resolution = float(M_PI/channels);
                              ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp: In member function 'void cv::details::FastX::detectImpl(const cv::Mat&, std::vector<cv::Mat>&, std::vector<cv::Mat>&, const cv::Mat&) const':
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp:631:30: error: 'M_PI' was not declared in this scope
         int num = int(0.5001*M_PI/parameters.resolution);
                              ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp: In member function 'void cv::details::Ellipse::draw(cv::InputOutputArray, const Scalar&) const':
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp:721:43: error: 'M_PI' was not declared in this scope
     cv::ellipse(img,center,axes,360-angle/M_PI*180,0,360,color);
                                           ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp: In static member function 'static float cv::details::Chessboard::Board::findMaxPoint(cv::flann::Index&, const cv::Mat&, const cv::details::Ellipse&, float, float, cv::Point2f&)':
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp:1541:17: error: 'M_PI' was not declared in this scope
         if(a1 > M_PI*0.5)
                 ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp:1543:16: error: 'M_PI' was not declared in this scope
         if(a2> M_PI*0.5)
                ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp: In static member function 'static bool cv::details::Chessboard::Board::estimateSearchArea(const Point2f&, const Point2f&, const Point2f&, float, cv::details::Ellipse&, const Point2f*)':
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp:1787:28: error: 'M_PI' was not declared in this scope
         angle = float(2.0F*M_PI-angle);
                            ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp: In member function 'void cv::details::Chessboard::findKeyPoints(const cv::Mat&, std::vector<cv::KeyPoint>&, std::vector<cv::Mat>&, std::vector<std::vector<float> >&, const cv::Mat&) const':
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp:2793:29: error: 'M_PI' was not declared in this scope
     para.resolution = float(M_PI*0.25);   // this gives the best results taking interpolation into account
                             ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp: In member function 'cv::Mat cv::details::Chessboard::buildData(const std::vector<cv::KeyPoint>&) const':
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp:2844:30: error: 'M_PI' was not declared in this scope
         (*val++) = float(2.0*M_PI-iter->angle/180.0*M_PI);
                              ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp: In member function 'std::vector<cv::KeyPoint> cv::details::Chessboard::getInitialPoints(cv::flann::Index&, const cv::Mat&, const cv::KeyPoint&, float, float, float) const':
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp:2874:25: error: 'M_PI' was not declared in this scope
         if(angle_temp > M_PI*0.5)
                         ^
E:\opencv-4.0.0-alpha\opencv-4.0.0-alpha\modules\calib3d\src\chessboard.cpp:2879:29: error: 'M_PI' was not declared in this scope
             if(angle_temp > M_PI*0.5)
                             ^
modules\calib3d\CMakeFiles\opencv_calib3d.dir\build.make:137: recipe for target 'modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/chessboard.cpp.obj' failed
mingw32-make[2]: *** [modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/chessboard.cpp.obj] Error 1
CMakeFiles\Makefile2:3018: recipe for target 'modules/calib3d/CMakeFiles/opencv_calib3d.dir/all' failed
mingw32-make[1]: *** [modules/calib3d/CMakeFiles/opencv_calib3d.dir/all] Error 2
Makefile:161: recipe for target 'all' failed
mingw32-make: *** [all] Error 2

原因

因为 OpenCV 在 chessboard.cppchessboard.hpptest_chesscorners.cpp 这些代码中有 BUG,使用的应该是 CV_PI 而不是 M_PI 导致的。具体见我提的 Issue:Failed to compile opencv-4.0.0-alpha using mingw-w64

解决

  • 在最新的 master 分支已经解决了这个问题,见我的 PR:M_PI changed to CV_PI

  • 如果你是在 官网 或者 github.com/opencv/opencv/releases 中下的 OpenCV 4.0.0-alpha,可能还会有这个问题,那么你需要把 chessboard.cppchessboard.hpptest_chesscorners.cpp 文件中的 M_PI 全部改为 CV_PI,如我的 commit 所示:M_PI changed to CV_PI (#12645)

然后重新 Configure-Generate-mingw32-make

4. ‘posix_memalign’ was not declared in this scope 错误【2018年11月17日修改,因编译 OpenCV-4.0.0-rc 时遇到并解决】

表现

[ 28%] Building CXX object modules/CMakeFiles/ade.dir/__/3rdparty/ade/ade-0.1.1c/sources/ade/source/alloc.cpp.obj
E:\opencv-4.0.0-rc\opencv-4.0.0-rc-build\3rdparty\ade\ade-0.1.1c\sources\ade\source\alloc.cpp: In function 'void* ade::aligned_alloc(std::size_t, std::size_t)':
E:\opencv-4.0.0-rc\opencv-4.0.0-rc-build\3rdparty\ade\ade-0.1.1c\sources\ade\source\alloc.cpp:31:16: error: 'posix_memalign' was not declared in this scope
     auto res = posix_memalign(&ret, std::max(sizeof(void*), alignment), size);
                ^~~~~~~~~~~~~~
mingw32-make[2]: *** [modules\CMakeFiles\ade.dir\build.make:63: modules/CMakeFiles/ade.dir/__/3rdparty/ade/ade-0.1.1c/sources/ade/source/alloc.cpp.obj] Error 1
mingw32-make[1]: *** [CMakeFiles\Makefile2:884: modules/CMakeFiles/ade.dir/all] Error 2
mingw32-make: *** [Makefile:162: all] Error 2

2018-11-17_174118.png

原因

因为我使用了 MinGW-w64-8.1.0 编译,而新的编译器在 Windows 下不再定义 WIN32,而定义成 _WIN32,如这个 Issue 的问题:error: ‘posix_memalign’ was not declared in this scope #12831

解决

opencv-4.0.0-rc-build\3rdparty\ade\ade-0.1.1c\sources\ade\source\alloc.cpp 文件的所有 WIN32 改为 _WIN32,如这个 PR 所做的修改:fix check for win32 #6

然后重新 Configure-Generate-mingw32-make

5. ‘D3D11_TEXTURE2D_DESC’ was not declared in this scope 错误【2019年4月10日修改,因编译 OpenCV-4.1.0 时遇到并解决】

表现

[ 32%] Building CXX object modules/core/CMakeFiles/opencv_core.dir/src/directx.cpp.obj
E:\opencv-4.1.0\opencv-4.1.0\modules\core\src\directx.cpp: In function 'void cv::directx::__convertToD3D11Texture2DNV(cv::InputAray, ID3D11Texture2D*)':
E:\opencv-4.1.0\opencv-4.1.0\modules\core\src\directx.cpp:1035:5: error: 'D3D11_TEXTURE2D_DESC' was not declared in this scope
     D3D11_TEXTURE2D_DESC desc = { 0 };
     ^~~~~~~~~~~~~~~~~~~~

MinGW-w64_D3D11_TEXTURE2D_DESC_Error.png

原因

D3D11_TEXTURE2D_DESCd3d11.h 中定义,貌似在我的机器上找不到定义。反正也不用 D3D11 与 OpenCL 交互,因此可以关闭 WITH_OPENCL_D3D11_NV 这个选项(默认是开的)。可见我的 issue:Error compiling 4.1.0 source code with mingw-w64: ‘D3D11_TEXTURE2D_DESC’ was not declared in this scope #14286

解决

方法一:

在 cmake-gui 编译配置中:

  • 不勾选 WITH_OPENCL_D3D11_NV

然后重新 Configure-Generate-mingw32-make

方法二:

如这个 PR 中对这两个 cmake 文件的修改:cmake: fix WITH_OPENCL_D3D11_NV check #14294,即可先判断是否可以用,再设置默认的 WITH_OPENCL_D3D11_NV

其他错误

如果以上错误不是你所遇到的,请务必先看下面两个文章中的错误。

  • 编译 32位 OpenCV 博文的常见错误
  • Tutorial: Installation from source for Windows with Mingw-w64

更新日志

  1. 2018年10月13日为 OpenCV-4.0.0-alpha 而修改,主要改了 “编译 OpenCV 常见错误”
  2. 2018年11月17日为 OpenCV-4.0.0-rc 而修改,主要改了 “编译 OpenCV 常见错误”
  3. 2019年4月10日为 OpenCV-4.1.0 而修改,主要改了 “编译 OpenCV 常见错误”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV使用CMake和MinGW-w64的编译安装 的相关文章

  • 无人机采集图像的相关知识

    1 xff0e 飞行任务规划 一般使用飞行任务规划软件进行飞行任务的设计 xff0c 软件可以自动计算相机覆盖和图像重叠情况 比如ArduPilot http ardupilot com 和UgCS http www ugcs com 是两
  • 无人机编程donekit及通讯(三)——仿真

    1 启动SITL 启动STL cd courseRoot apm ardupilot sim vehicle py v ArduCopter console map 飞机起飞降落 mode GUIDED arm throttle takeo
  • DroneKit(四)——无人机协同

    coding utf8 from dronekit import connect VehicleMode LocationGlobalRelative APIException import time import exceptions i
  • 看这篇就够了——opencv与libopencv与cv_bridge的安装与使用

    一 基本关系 opencv OpenCV的全称是Open Source Computer Vision Library xff0c 是一个跨平台的计算机视觉处理开源软件库 xff0c 是由Intel公司俄罗斯团队发起并参与和维护 xff0c
  • Linux下更改oracle客户端字符集和服务端字符集

    from http blog csdn net chid article details 6166506 Linux 下更改 oracle 客户端字符集和服务端字符集 1 Linux 下更改 oracle 客户端字符集 xff0c 即设置环
  • C语言书籍推荐

    C 语言书籍推荐 宗旨 xff1a 技术的学习是有限的 xff0c 分享的精神是无限的 一 基础 1 C语言入门很简单 零起点学通C语言 xff08 多媒体范例教学 xff09 C语言从入门到精通 2 C程序设计语言 第2版 新版 C程序设
  • Jetson配置realsense D435i SDK以及realsense-ros

    一 命令安装 SDK sudo apt install librealsense2 realsense viewer 测试 realsense ros sudo apt get install ros ROS DISTRO realsens
  • 工程(十一)——NUC11+D435i+VINS-FUSION+ESDF建图(github代码)

    博主的合并代码 git 64 github com huashu996 VINS FUSION ESDFmap git 一 D435i深度相机配置 1 1 SDK 43 ROS 参考我之前的博客 xff0c 步骤和所遇见的问题已经写的很详细
  • 从零入门激光SLAM(八)——ROS常用消息

    大家好呀 xff0c 我是一个SLAM方向的在读博士 xff0c 深知SLAM学习过程一路走来的坎坷 xff0c 也十分感谢各位大佬的优质文章和源码 随着知识的越来越多 xff0c 越来越细 xff0c 我准备整理一个自己的激光SLAM学习
  • 嵌入式软件开发,快五年,没有成就感,快迷失自己了

    嵌入式软件开发 xff0c 快五年 xff0c 没有成就感 xff0c 快迷失自己了 看到了这个的问题 xff0c 其实这个问题何尝不是很多软件开发人员的困惑呢 至少我自己如此 在任何公司 xff0c 个人永远就是一枚螺丝钉的角色 当公司的
  • 从高校中走出的 Apache 顶级项目 —— IoTDB 核心成员黄向东

    本期访谈嘉宾 xff1a 黄向东 Apache 顶级开放源代码项目 IoTDB xff08 物联网数据库 xff09 核心成员 2021 年开源先锋 清华大学软件学院助理研究员 Q xff1a 简单介绍一下 Apache IoTDB IoT
  • pixhawk入门 -- 编译环境问题解决过程

    pixhawk 编译的基本操作步骤 xff1a 1 xff09 下载固件仓 git clone https github com PX4 Firmware git 2 xff09 更新固件代码 cd Firmware git submodu
  • 树莓派的供电问题

    树莓派99 的故障来自于5V电源 树莓派出现任何故障 xff08 死机 键盘和鼠标不工作 显示器变暗或失真 终端程序出现乱码 xff0c 无法开机 xff0c 运行的程序死机 xff0c usb设备无法识别或不工作 网络故障等 xff09
  • 树莓派的操作系统介绍

    1 Raspbian 单纯的Arm版的Linux系统 xff0c 基于Debian 是当前实用最广泛的操作系统 2 Pidora 单纯的Arm版的Linux系统 xff0c 基于Fedora 是拥有另一种风格的树莓派操作系统 3 Arch
  • gd32e103加入freertos的步骤

    gd32E103的芯片比较强大 xff0c m4的内核 xff0c 120mhz主频 xff0c 跑freertos是没有问题的 作为一个轻量级的操作系统 xff0c FreeRTOS提供的功能包括 xff1a 任务管理 时间管理 信号量
  • oracle数据库开启的时候 是先开监听还是先开主服务,关数据库的时候呢???...

    启动的时候无所谓先后 xff0c 关闭的话 1 首先是关闭监听 xff08 让远程客户端无法再连进来 xff09 xff1b 2 发出一个系统检查点 xff0c 让数据文件和控制文件的系统修改号统一 xff1b xff08 alter sy
  • Docker本地images删除问题

    背景 测试环境和生产环境 部署了不同的registry服务 xff0c 通过cli 操作过生产环境或测试环境push xff0f pull image功能 本地虚拟机 xff0c docker image 残留了很多image xff0c
  • Aruco的使用+opencv+opencv_contrib+cmake

    Aruco的使用 By GuangyeHu 1 下载 xff1a https sourceforge net projects aruco files 解压到相应的文件夹 2 安装Cmake 本次实现使用的是cmake 3 15 1 win
  • Nginx 配置多个Vue项目

    背景 xff1a 公司要求将之前用不同端口号区分的三个独立的系统统一配置到统一域名下 VUE项目配置 示例 xff1a 有两个项目 第一个 xff1a 打包到 96 test1 96 目录中 xff1b 第二个 xff1a 打包到 96 t
  • AD随堂笔记

    算起来 xff0c 这次算是第四次打板子了 xff0c 还是出现了不可饶恕的错误 串口三的TXD RXD接反了 xff0c 还有一根线是短路的 造成的原因 xff0c 就是没有进行规则检查 因为这个板子是在原来基础上面改的 xff0c 大意

随机推荐

  • 学习Linux必备书籍推荐

    xfeff xfeff 鸟哥的私房菜 xff08 第3版 xff09 xff0c 鸟哥著 xff1a 这本书内容丰富全面 xff0c 基本概念的讲解非常细致 xff0c 深入浅出 xff0c 各种功能和命令的介绍都配以大量的实例操作和详尽的
  • 无人机目标检测 Darknet-ROS 学习(一)

    无人机目标检测 Darknet ROS 学习 xff08 一 xff09 简介 在无人机上实现目标检测 xff0c 使用的设备是阿木实验室P200 xff0c 飞控是PX4 xff0c 板载计算机是TX2 xff0c 目的是在无人机有限的计
  • Android - Service

    前台20s后台200s不执行玩就报ANR异常 一 概念 没有界面在后台长期运行在主线程中的一个组件 ServiceThread可以配置执行在不同的进程中 CPU调度的最小单位 任何有Context的地方都可以控制Service当Activi
  • 2022年打工人转行实录!你后悔转行了吗?

    2022年 xff0c 有许多年轻人在寻求 转行 根据 2022Q1中高端人才就业趋势大数据报告 xff0c 今年一季度有55 87 的职场人有跳槽计划 xff0c 而这之中 xff0c 有65 34 的职场人选择跨行业跳槽 在各种社交平台
  • 2.PendSV的触发

    PendSV典型使用场合是在上下文切换时 xff08 在不同任务之间切换 xff09 我们先简单的写几段代码实现PendSV的中断触发 xff0c 当然也会涉及到CM3内核汇编指令 xff0c 自从开始挑战的那天起 xff0c 你不如地狱谁
  • C语言: 字符串结束符 ‘ \0 ’

    1 本质 39 0 39 是字符串结束标志 xff0c 不计入串长 xff0c 但要占内存空间 39 0 39 是一个ASCII控制字符 xff0c 是转义字符 意思是告诉编译器 xff0c 这不是字符0 xff0c 而是空字符 空字符 0
  • Docker中容器的备份、恢复和迁移

    转自 xff1a http www linuxidc com Linux 2015 08 121184 htm 1 备份容器 首先 xff0c 为了备份Docker中的容器 xff0c 我们会想看看我们想要备份的容器列表 要达成该目的 xf
  • Ubuntu 安装 clang++

    clang 安装
  • 对vector使用指针

    include lt stdio h gt include lt iostream gt include lt vector gt using namespace std int main vector lt int gt a b c fo
  • 单片机初学者电路常识

    电路常识性概念 xff08 1 xff09 输入 输出阻抗 1 输入阻抗 输入阻抗是指一个电路输入端的等效阻抗 在输入端上加上一个电压源U xff0c 测量输入端的电流I xff0c 则输入阻抗Rin 61 U I 你可以把输入端想象成一个
  • 使用 FreeRTOS 时使用 GPIO 监控 CPU 负载的正确方法?

    总目录链接 61 61 gt gt AutoSAR入门和实战系列总目录 总目录链接 61 61 gt gt AutoSAR BSW高阶配置系列总目录 文章目录 我想切换一些 GPIO 以监控 CPU 活动和 FreeRTOS 上下文 更具体
  • iTerm2 + OhMyZsh + agnoster + Powerline + solarized = 漂亮的Mac终端

    唠叨一下 自从装了黑苹果后一直用着 Mac 自带的终端 xff08 Terminal xff09 xff0c 相比 Windows 的终端根本无法同台竞技 xff01 毕竟 Mac 是基于 Unix 嘛 对开发友好太多了 就是下面这个家伙了
  • CloudCompare功能概要

    File open xff1a 打开save xff1a 保存Global Shift settings xff1a 设置最大绝对坐标 xff0c 最大实体对角线Primitive Factory xff1a 对点云进行原始加工 xff0c
  • 机会总是留给有准备的人 —— 从裁缝到码农

    序言 2014年8月 xff0c 一个男生拿着广工服装工程专业的录取通知书来到东风路 xff0c 望着学校大门 xff0c 想着 xff1a 这就是我的大学 xff1f 2014年11月 xff0c 一个男生一个女生望着广工大学城的大门 x
  • Launcher 启动 UE4 引擎出现 An Unreal process has crashed 的问题

    Launcher 启动 UE4 引擎出现 An Unreal process has crashed 的问题 问题描述 在 Launcher 启动 UE4 引擎 xff0c 引擎奔溃 xff0c 出现奔溃报告 xff1a An Unreal
  • 使用MFC的CDC类绘制三维坐标系及球面函数

    系列链接 使用MFC的CDC类绘制二维坐标系及正余弦函数 源码 使用MFC的CDC类绘制三维坐标系及球面函数 源码 概述 本文使用MFC的CDC类绘制三维坐标系及球面函数 首先计算推导出三维坐标在二维平面显示的坐标变换方程 xff08 使用
  • VSCode 的 C/C++ 调试环境的 launch.json、 tasks.json 文件

    launch json span class hljs comment Configuring tasks json for C C 43 43 debugging span span class hljs comment author h
  • Linux 修改PostgreSQL外部访问白名单

    1 查找配置文件 find name pg hba conf find name postgresql conf 2 修改 2 1 修改pg hba conf 查找IPv4 local connections 修改默认的 host all
  • Python 生成带标签数据集的 CSV 文件

    span class hljs comment usr bin python span span class hljs comment coding UTF 8 span span class hljs comment Python 生成
  • OpenCV使用CMake和MinGW-w64的编译安装

    前言 之前写过的一篇博文 xff1a OpenCV使用CMake和MinGW的编译安装及其在Qt配置运行 是使用 32 位的 MinGW 在 Windows 下编译 OpenCV 生成 32 位的 dll 而这篇博文是使用 64 位的 Mi