如何在 Windows 上将 OpenCV 库正确链接到 Eclipse?

Posted

技术标签:

【中文标题】如何在 Windows 上将 OpenCV 库正确链接到 Eclipse?【英文标题】:How can I correctly link OpenCV libraries to Eclipse on Windows? 【发布时间】:2016-05-15 12:41:37 【问题描述】:

在过去的几个小时里,我一直在尝试让一个基本的 OpenCV 程序在我的 Eclipse Mars IDE 中工作。该程序由以下 main.cpp 组成:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main( int argc, char** argv )

  if( argc != 2)
  
   cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;
   return -1;
   

  Mat image;
  image = imread(argv[1], CV_LOAD_IMAGE_COLOR);   // Read the file

  if(! image.data )                              // Check for invalid input
  
    cout <<  "Could not open or find the image" << std::endl ;
    return -1;
  

  namedWindow( "Display window", WINDOW_AUTOSIZE );// Create a window for display.
  imshow( "Display window", image );                   // Show our image inside it.

  waitKey(0);                                          // Wait for a keystroke in the window
  return 0;

到目前为止我做了什么:

    已安装 MinGW(在 E:\NVPACK\MinGW)并将其 bin 文件路径添加到我的环境变量中。

    在 E:\opencv 安装了 OpenCV 2.4.12。在已安装的文件夹内是“build”和“sources”文件夹。

    使用 MinGW GCC 工具链创建了一个新的 Eclipse C++ 项目。

    在工具设置中(项目属性 --> C/C++ 构建 --> 设置)我将 OpenCV 库作为“E:\opencv\build\include”包含在 GCC C++ 编译器中

    在我在 MinGW C++ 链接器中添加的所有库(即 opencv_core2412、opencv_highgui2412、opencv_imgproc2412)的工具设置中,并将库搜索路径设置为“E:\opencv\build\x86\vc12\lib”

    将我的二进制解析器设置为 PE Windows 解析器。

构建项目所有OpenCV函数得到未定义引用错误,如:

undefined reference to `cv::imread(std::string const&, int)'    main.cpp    line 17 C/C++ Problem
undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'   main.cpp    line 26 C/C++ Problem

很奇怪,声明 Mat 图像不会出错,并且将鼠标悬停在它上面会正确显示 OpenCV 的 Mat 文档。

谷歌搜索问题我发现由于某种原因我可能需要使用 CMake 来构建我自己的库文件(在第 5 步中使用的那些)。所以在安装了 CMake gui 之后,我使用 E:\opencv\sources 作为源目录,并新建了一个目录 E:\opencv\MinGW 作为我的构建目录。我使用“Eclipse CDT4 -MinGW Makefiles”生成器来配置文件。按下配置后,我的 g++ 编译器会收到以下错误(我的 gcc 编译器也有类似的错误):

CMake Error at CMakeLists.txt:71 (project):
The CMAKE_CXX_COMPILER:

E:/NVPACK/MinGW/bin/mingw32-g++

is not a full path to an existing compiler tool.

Tell CMake where to find the compiler by setting either the environment
variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path
to the compiler, or to the compiler name if it is in the PATH.

但是编译器被标识:“CXX 编译器标识是 GNU 4.8.1”和“C 编译器标识是 GNU 4.8.1”

非常感谢任何有关如何在 Windows 7 上的 Eclipse Mars 中正确设置 OpenCV 2.4.12 库的帮助!

【问题讨论】:

您怀疑是什么问题?我已经能够正确构建、编译和运行使用我当前 MinGW 设置的程序。此外,我还测试了另一个使用 OpenCV 旧功能(例如 cvLoadImage 和 cvShowImage)的程序,它实际上可以工作。 *编辑:这是对我的 MinGW 安装可能是问题的评论的回应(但是评论已被删除)。 你设置opencv环境变量了吗?见this。此外,您似乎应该将库搜索路径设置为“E:\opencv\build\x86\mingw\lib”(而不是 vc12)。 @A.Sarid 是的,我已将其设置为 E:\opencv\build\x86\vc12\bin。还尝试了 E:\opencv\build\x86\vc12 (类似于您的链接),但它给出了相同的结果(当然是在重新启动 Eclipse 之后)。 @A.Sarid 设置我的库搜索路径不会做太多,因为我没有那个目录。我尝试自己构建二进制文件,但正如您在我的帖子中看到的那样,我从 CMake 中得到错误。在 vc12 中是链接中描述的预构建二进制文件。我确实认为问题出在这些库文件中,但不知道如何解决 CMake 错误。 【参考方案1】:

好吧,我希望这足够详细!首先,一大杯咖啡会有所帮助!

让我们开始吧:

要求:

从 github repo 下载 OpenCV 源代码(将其解压缩到我们将命名为 opencv_src_folder 的文件夹) 下载并安装MinGW(同时将/bin文件夹添加到系统路径) 下载安装CMake

步骤:

打开 CMake-gui

设置src文件夹为opencv_src_folder 将构建文件夹设置为opencv_src_folder/Mingw_build/ 点击configure 并选择Eclipse CDT4 - MinGW MakeFile 然后下一步。 如果配置成功,点击generate

打开命令行(Windows + R)

$cd opencv_src_folder/Mingw_build/ $mingw32-make: 这将使用 MinGW 制作 openCV,所以请等到它完成! 现在,让我们安装它 $ mingw32-make install 这将在 opencv_src_folder/Mingw_build/install/ 中安装 cmake

opencv_src_folder/Mingw_build/install/bin/ 添加到您的系统路径并重新启动会话。

Eclipse 配置:

转到 Eclipse CDT IDE,使用示例 OpenCV 代码创建 C++ 程序。 转到项目 > 属性 > C/C++ 构建 > 设置 > GCC C++ 编译器 > 包含,并添加源 OpenCV 文件夹“opencv_src_folder/Mingw_build/install/include/”

转到项目 > 属性 > C/C++ 构建 > 设置 > MinGW C++ 链接器 > 库,并分别添加到库 (-l) 中:(不要忘记将 245 更改为他们使用的任何数字对于 lib 文件) opencv_calib3d245 opencv_contrib245 opencv_core245 opencv_features2d245 opencv_flann245 opencv_gpu245 opencv_highgui245 opencv_imgproc245 opencv_legacy245 opencv_ml245 opencv_nonfree245 opencv_objdetect245 opencv_photo245 opencv_stitching245 opencv_video245 opencv_videostab245

将构建的 OpenCV 库文件夹 opencv_src_folder/Mingw_build/install/lib 添加到库搜索路径 (-L)。

测试:

您可以使用以下代码作为测试:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main( int argc, char** argv )

  if( argc != 2)
  
   cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;
   return -1;
  

  Mat image;
  image = imread(argv[1], CV_LOAD_IMAGE_COLOR);   // Read the file

  if(! image.data )                              // Check for invalid input
  
    cout <<  "Could not open or find the image" << std::endl ;
    return -1;
  

  namedWindow( "Display window", WINDOW_AUTOSIZE );// Create a window for display.
  imshow( "Display window", image );                   // Show our image inside it.

  waitKey(0);                                          // Wait for a keystroke in the window
  return 0;

最后构建你的项目!

希望有帮助!

【讨论】:

感谢您提供命令,但不幸的是,它提供的输出与使用 CMake (3.5.2) gui 时完全相同。在 E:\opencv\MinGW 文件夹中,我仍然只得到一个 3.5.2 文件夹,其中包含两个名为“CompilerIdC”和“CompilerIdCXX”的文件夹,但没有 lib 文件夹。 非常感谢您的详尽回答。我觉得我快到了。二进制文件的 CMake 编译成功,mingw32-make 命令也成功(尽管由于已知错误,我不得不切换到更新版本的 OpenCV:code.opencv.org/issues/4087)。我像你说的那样链接了所有库,但我仍然得到对 imread、imshow 和 named 的未定义引用(仅此而已,所以它有助于摆脱 8 个错误中的 5 个)。我认为 opencv_src_folder/include/opencv2 文件夹中缺少一些文件。目前只有 opencv.hpp 在那里。现在呢? 你是哪个版本的? 尝试使用$ mingw32-make installuse the bin, lib, include that are created inside the install folder 安装它。这应该可以解决问题,我相应地编辑了答案! 就是这样,它正在工作。非常感谢!只是为了分享我用来让它工作的 OpenCV 存储库:github.com/Itseez/opencv/tree/master。 (不要忘记将 245 更改为 310 或它们用于 lib 文件的任何数字)。【参考方案2】:

上面的帖子真的很好,让我很接近,但不是一路走来。以下是我采取的一些额外步骤,最终对我有用。

构建和安装 OpenCV 的提示

注意:我在 Windows 10 中构建了这个(在 Mac 上使用 Parallel 的桌面,但我认为这不重要)

    首先,我使用了 3.13.1 版本的 Cmake 并下载了最新的 openCV repo(上面的链接带你到旧版本)。

    确保每次使用 Cmake-gui 构建时,要么清除缓存,然后从该文件夹中删除所有内容,要么创建一个新目录并在这个新目录中构建(我个人做了第二个) .

    接下来,我从here 下载了MinGW 安装程序。但是在安装的时候,改用了下面的配置

经过大量谷歌搜索和阅读github问题后,我发现有人只能使用MinGW的这个配置来构建和安装,我也是。另外,当你安装这个版本的MinGW并添加这个到路径确保您从系统路径中删除当前正在使用的任何其他版本,并删除该文件夹。当你运行 Cmake-GUI 时,当你点击配置时,它应该会告诉你它是用这个新的 MinGW 库构建的,如果你做的一切都正确的话。

    接下来,像往常一样添加到系统路径并重新启动命令提示符。

    第一次在 Cmake-GUI 中配置后,还要进行以下操作:

    搜索 CMAKE_BUILD_TYPE 并在其值列中添加“发布”(不带引号)

    搜索 WITH_MSMF 并取消选中它。

    搜索 ENABLED_PRECOMPILED_HEADERS 并取消选中它。

Eclipse 配置提示

正如上面帖子中提到的,eclipse 的一切都对我有用,除了我必须明确添加

--std=c++11 标志位于 Project > Properties > C/C++ Build > Settings > GCC C++ Compiler > Miscellaneous > Other Flags 下

在添加这个之前,每个带有 openCV 库的程序都会给我上千个错误。

【讨论】:

【参考方案3】:

关注最佳答案的人在编译时可能会遇到问题,如下所示:

modules\highgui\CMakeFiles\opencv_highgui.dir\build.make:187: recipe for target 'modules/highgui/CMakeFiles/opencv_highgui.dir/src/window_w32.cpp.obj' failed
mingw32-make[2]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/src/window_w32.cpp.obj] Error 1
CMakeFiles\Makefile2:2203: recipe for target 'modules/highgui/CMakeFiles/opencv_highgui.dir/all' failed
mingw32-make[1]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/all] Error 2
Makefile:159: recipe for target 'all' failed
mingw32-make: *** [all] Error 2

如果发生这种情况,有一个很好的答案here。

将其作为可见性的单独答案发布,适用于来自 google 的有此问题的人(如我自己),否则他们会花费 20-30 分钟尝试在 google 上搜索它(就像我一样)。

编辑:

在模块/highgui/src/window_w32.cpp中

请像这样在#endif 和#include 行之间添加这一行

#  pragma GCC diagnostic ignored "-Wmissing-declarations"
#endif

/*start new code lines*/
#if (_WIN32_IE < 0x0500)
#pragma message("WARNING: Win32 UI needs to be compiled with _WIN32_IE >= 0x0500 (_WIN32_IE_IE50)")
#define _WIN32_IE 0x0500
#endif
/*end new code lines*/   

#include <commctrl.h>
#include <stdlib.h>
#include <string.h>

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review 已编辑。谢谢

以上是关于如何在 Windows 上将 OpenCV 库正确链接到 Eclipse?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mac 上将 openCV 安装到 Enthought python 发行版中

在 Windows 上将 ffmpeg 库构建为静态 (.lib) 文件

如何在适用于 Android 和 iOS 的 C++ 跨平台库中正确链接 OpenCV?

如何在 IIS 7、Windows 7 上将 ASP.NET 4.0 添加为应用程序池

在 CodeBlocks 中链接 OpenCV 库失败?

OpenCV 在 OSX 上将级联保留在哪里?