CLion + OpenCV + cmake,源码编译及使用

为什么要用CLion呢。多个工具多条路,现在美国在搞封闭,万一哪天VS不能用了呢。。。CLion本身只是一个IDE,没有编译器。像Visual Studio就是IDE和编译器一体的,所以安装后即可使用,不用做额外的配置。想要真正把CLion用起来,需要另外配置编译器,我们这里的基调是假设VS不能用,所以编译器不能使用VS,本文使用的是mingw64。下面进入正题

工具和环境准备

  • Windows操作系统,win10
    • 安装过程略
  • mingw64
    • 见后面部分
  • CLion
    • 见后面部分
  • OpenCV源码
    • 官网:https://opencv.org/
    • 下载页面:https://opencv.org/releases/
    • 进入下载页面,随便下一个OpenCV的源码包,即点击Sources进行下载,这里下载的是opencv-4.4.0.zip
  • cmake
    • 官网:https://cmake.org/
    • 下载页面:https://cmake.org/download/
    • 进入下载页面,下载最新的cmake安装包,.msi后缀的那种,这里下载的是cmake-3.18.4-win64-x64.msi
    • 双击安装包,安装cmake。安装路径根据需求修改。

配置mingw64

下载

mingw64官网的名称是mingw-w64,从名称就容易看出来这个编译器支持64位编程。windows下还有一个很容易跟mingw64混淆的编译器,叫MinGW(Minimalist GNU for Windows),MinGW似乎只支持32位。

  • mingw64官网:https://mingw-w64.org/doku.php
  • 下载网址:https://sourceforge.net/projects/mingw-w64/files/

官网没有下载链接,下载链接在sourceforge上面。最好不要下载Online Installer,这个在线安装工具点开后首先要下载一个repository.txt,这个文件似乎在墙外,所以在线安装搞不定。

我下载的文件是:
x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z

windows下似乎有两种版本后缀,一个是sjlj,一个是seh,两种有什么区别我也不太清楚,只是看seh版本的下载的人多,所以就随大流了。

有一个需要特别注意的地方:一定要下载64位的mingw64,不要下载32位的(文件名中带有-win32),切记!

在这里插入图片描述

配置环境变量

mingw64不用安装,只需要解压并配置环境变量即可。所以下载完成后首先解压到一个地方,路径中不要有空格。

解压后的文件夹中有一个bin文件夹,将bin的完整路径D:\Program\mingw64\bin加入环境变量:

此电脑(右键)-> 高级系统设置 -> 环境变量 -> 双击 Path增加环境变量,注意你的路径跟我的可能不一样。

配置环境变量后可能需要重启才能生效。

cmake构建OpenCV工程

构建和编译OpenCV的过程跟CLion没有关系,只跟编译器mingw64有关。

  1. 解压opencv-4.4.0.zip,我这里解压后的路径是D:\software\opencv-4.4.0,在此路径下新建一个文件夹build_mingw64,cmake构建的结果就输出在这个文件夹下(build文件夹可建立在任何地方,之所以建立在opencv解压目录下,为了清楚了解build对应的源代码是哪一份,个人习惯而已)

  2. 双击cmake-gui,配置两个路径:
    (1)源码路径:D:\software\opencv-4.4.0
    (2)构建输出路径:D:\software\opencv-4.4.0\build_mingw64
    在这里插入图片描述

  3. 点击Configure,弹出选择编译器的界面,选择MinGw Makefiles,然后点击Finish开始配置,此过程需耗费点时间,另外Configure一般不会一次成功,因为FFMPEG总是在cmake的过程中下载失败,FFMPEG是视频编解码需要的库,所以非常必要。
    在这里插入图片描述
    尽管Configure第一次无法成功,但还是得点一下才能产生日志,然后才能根据日志去解决问题。第一次Configure后结果见下图,注意到上面一栏中一坨红色,表明配置存在问题,下面可以看到FFMPEG那里都是NO,往上翻一翻日志就会知道是相关的dll下载不成功。
    在这里插入图片描述

    可以打开下载日志文件D:/software/opencv-4.4.0/build_vs2019/CMakeDownloadLog.txt查看哪些组件下载失败,此文件中也会告诉我们到哪里下载缺失的组件。打开该日志文件后可以找到如下信息:

    #do_copy “opencv_videoio_ffmpeg.dll” “854b3460c435d04277e1f1ecc06cb809” “https://raw.githubusercontent.com/opencv/opencv_3rdparty/1df9bf0c0c6c2cf225bd3d8e4cf5985198352454/ffmpeg/opencv_videoio_ffmpeg.dll” “D:/software/opencv-4.4.0/build_mingw64/3rdparty/ffmpeg”
    #missing “D:/software/opencv-4.4.0/build_mingw64/3rdparty/ffmpeg/opencv_videoio_ffmpeg.dll”
    #check_md5 “D:/software/opencv-4.4.0/.cache/ffmpeg/854b3460c435d04277e1f1ecc06cb809-opencv_videoio_ffmpeg.dll”

    上面的日志至少告诉我们如下信息:1. opencv_videoio_ffmpeg.dll的下载网址;2. 本地存放的路径;3. 需要校验md5。

    因为要校验md5,所以我们不能随便下载一个同名dll放到本地存放路径下,必需下载上述网址的dll。接下来手动下载上述文件并放入.../build_vs2019/3rdparty/ffmpeg中即可。同理下载opencv_videoio_ffmpeg_64.dllffmpeg_version.cmake。需要注意 ffmpeg_version.cmake 点击链接后可能直接打开了链接而不是下载,此时不能使用复制粘贴的方式把信息搞下来,而应该在网页上点右键 -> 另存为的方式保存文件,然后把后缀.txt干掉,不然MD5校验不通过。

    下载好并放入相应文件夹之后,再次点击Configure进行配置,这次速度会快一些,因为已经配置好的内容会直接跳过去。配置好后上面的一坨红消失了,并且下面日志也不会有诡异的错误。
    在这里插入图片描述

  4. 在上栏中,确保以下几个选项没有被打勾,如果打勾的话可能导致编译失败:
    (1)ENABLE_PRECOMPILED_HEADERS
    (2)WITH_MSMF
    (3)WITH_IPP
    (4)WITH_TBB
    (5)OPENCV_ENABLE_ALLOCATOR_STATS

    (1)~(4)据说是专门为了支持VS而设置的;
    (5)如果勾上的话可能出现以下错误:

    gcc: error: long: No such file or directory
    D:\Program\mingw64\bin\windres.exe: preprocessing failed.
    mingw32-make[2]: *** [modules\core\CMakeFiles\opencv_core.dir\build.make:1494: modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj] Error 1
    mingw32-make[2]: *** Waiting for unfinished jobs…
    mingw32-make[1]: *** [CMakeFiles\Makefile2:1882: modules/core/CMakeFiles/opencv_core.dir/all] Error 2
    mingw32-make: *** [Makefile:181: all] Error 2

  5. 在上栏中,有一个很特别的选项,叫BUILD_opencv_world,如果勾上的话,编译后会生成一个比较大的dll,如果不打勾的话,则生成一堆零散的dll。

  6. 点击Generate生成工程,这一步通常没有什么坑,并且速度比较快。

mingw64编译OpenCV工程

  1. 打开cmd,进入build目录D:\software\opencv-4.4.0\build_mingw64
  2. 输入以下命令开始编译:
mingw32-make
或
mingw32-make -j8

-j8的意思是使用多线程编译,不然速度有点慢。后面那个8表示线程数,CPU好的话可以改大点,不太好就改小点。

中间如果有warning不用管,只要不是error就行,error会导致编译失败退出。如果error了,下次再编译前最好使用下面命令clean一下之前的错误编译。

mingw32-make clean

mingw32-make成功以后,在D:\software\opencv-4.4.0\build_mingw64\bin下面就出现所需的dll文件,但是我们还需要头文件和静态库文件,整体比较分散,为了把所有有用的东西都聚到一起,也为了后面写程序时调用方便,在cmd中继续执行下面命令,将后面调用所需的文件都拷贝到一个install文件夹下,此步骤也很重要,不要忘记。

mingw32-make install

安装并配置CLion

CLion官网:http://www.jetbrains.com/clion/

CLion目前针对学生、教师、教育机构等等一些个人或组织有免费或打折的license,但对于一般的人并没有类似社区版这样的免费版本,所以需要付费使用。

安装

去官网下载exe后双击安装,没有什么特别需要注意的。

个人习惯在Installation Options的地方把Add "Open Folder as Project"勾上。勾上后右键点击文件夹后,弹出菜单会出现Open Folder as CLion Project,方便打开项目。

在CLion中配置mingw64

  • 打开CLion,第一次打开应该需要激活,但我选择Evaluate for free选项。

  • 点击New Project新建个工程,Language standard根据需求选择,然后点击create创建项目,进去后应该默认有一个hello world的程序。
    在这里插入图片描述

  • 如果之前已经把mingw64的路径配进环境变量中了,那么CLion可能能够自己搜索到mingw64并自动配置,但是如果没有自动配置好的话,那么可以按照如下方式配置:依次点击File -> Settings -> Build, Execution, Deployment -> Toolchains,按下图配置
    在这里插入图片描述

配置CLion的Release模式

此时的CLion已经可以写程序,但是只能在Debug模式下写程序,而没有Release模式。

增加Release模式的方法比较简单,在File -> Settings -> Build, Execution, Deployment -> CMake里设置,在右侧界面点击“+”号,CLion会自动生成Release选项(原本只有Debug),然后点击OK。
在这里插入图片描述
然后就可以在主界面选择Debug还是Release了:
在这里插入图片描述

在CLion中使用OpenCV

CLion使用cmake来配置工程,所以调用OpenCV的关键就在于写CMakeLists.txt

在新建工程后,CMakeLists.txt 中默认已经有了一些内容:

cmake_minimum_required(VERSION 3.17)
project(TestCLion)
set(CMAKE_CXX_STANDARD 17)
add_executable(TestCLion main.cpp)

除了第3行外,其它都是必须的。

在我们刚才编译出的OpenCV的install目录中有一个名为OpenCVConfig.cmake的文件,告诉我们在CMakeLists.txt中添加哪些东西可以调用OpenCV,该文件位置为:
D:\software\opencv-4.4.0\build_mingw64\installOpenCVConfig.cmake

打开该文件,最上面的注释写着:

# ===================================================================================
#  The OpenCV CMake configuration file
#
#             ** File generated automatically, do not modify **
#
#  Usage from an external project:
#    In your CMakeLists.txt, add these lines:
#
#    FIND_PACKAGE(OpenCV REQUIRED)
#    TARGET_LINK_LIBRARIES(MY_TARGET_NAME ${OpenCV_LIBS})
#
#    Or you can search for specific OpenCV modules:
#
#    FIND_PACKAGE(OpenCV REQUIRED core imgcodecs)
#
#    If the module is found then OPENCV_<MODULE>_FOUND is set to TRUE.
#
#    This file will define the following variables:
#      - OpenCV_LIBS                     : The list of libraries to link against.
#      - OpenCV_INCLUDE_DIRS             : The OpenCV include directories.
#      - OpenCV_COMPUTE_CAPABILITIES     : The version of compute capability
#      - OpenCV_VERSION                  : The version of this OpenCV build: "4.4.0"
#      - OpenCV_VERSION_MAJOR            : Major version part of OpenCV_VERSION: "4"
#      - OpenCV_VERSION_MINOR            : Minor version part of OpenCV_VERSION: "4"
#      - OpenCV_VERSION_PATCH            : Patch version part of OpenCV_VERSION: "0"
#      - OpenCV_VERSION_STATUS           : Development status of this build: ""
#
#    Advanced variables:
#      - OpenCV_SHARED
#
# ===================================================================================

第6到10行告诉我们怎么修改CMakeLists.txt以使用OpenCV,但事实上只添加9,10两行并不行。比如我们将CMakeLists.txt改成如下内容(注意MY_TARGET_NAME应当改成我们自己的项目名称TestCLion),然后点击CLion右上角的Reload changes,当CMakeLists.txt发生改变后,右上角会自动弹出Reload changes可以点。

cmake_minimum_required(VERSION 3.17)
project(TestCLion)
set(CMAKE_CXX_STANDARD 17)
add_executable(TestCLion main.cpp)

find_package(OpenCV REQUIRED)
target_link_libraries(TestCLion ${OpenCV_LIBS})

有一点需了解,在CMakeLists.txt中,命令不区分大小写,如FIND_PACKAGE等同于find_package,但是括号中的变量必需区分大小写。
在这里插入图片描述

然后CLion的下方窗口会显示如下错误信息:

CMake Error at CMakeLists.txt:6 (find_package):
  By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "OpenCV", but
  CMake did not find one.

  Could not find a package configuration file provided by "OpenCV" with any
  of the following names:

    OpenCVConfig.cmake
    opencv-config.cmake

  Add the installation prefix of "OpenCV" to CMAKE_PREFIX_PATH or set
  "OpenCV_DIR" to a directory containing one of the above files.  If "OpenCV"
  provides a separate development package or SDK, be sure it has been
  installed.


-- Configuring incomplete, errors occurred!
See also "D:/clion/TestCLion/cmake-build-release/CMakeFiles/CMakeOutput.log".

上面信息简单来说就是需要设定OpenCV_DIR,于是CMakeLists.txt最终需写为

cmake_minimum_required(VERSION 3.17)
project(TestCLion)
set(CMAKE_CXX_STANDARD 17)
add_executable(TestCLion main.cpp)

set(OpenCV_DIR D:/software/opencv-4.4.0/build_mingw64/install)
find_package(OpenCV REQUIRED)
target_link_libraries(TestCLion ${OpenCV_LIBS})

然后再次点击Reload changes,下面窗口会提示如下信息:

-- OpenCV ARCH: x64
-- OpenCV RUNTIME: mingw
-- OpenCV STATIC: OFF
-- Found OpenCV 4.4.0 in D:/software/opencv-4.4.0/build_mingw64/install/x64/mingw/lib
-- You might need to add D:/software/opencv-4.4.0/build_mingw64/install/x64/mingw/bin to your PATH to be able to run your applications.
-- Configuring done
-- Generating done
-- Build files have been written to: D:/clion/TestCLion/cmake-build-release

注意看第5行,这是让我们把D:\software\opencv-4.4.0\build_mingw64\install\x64\mingw\bin文件夹加入到环境变量中,加入方法跟之前配置mingw64的bin文件夹时一样:此电脑(右键)-> 高级系统设置 -> 环境变量 -> 双击 Path添加环境变量,添加后需重启CLion。

下面是一段测试代码,点击右上角三角符号运行
在这里插入图片描述

#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
    string imagePath = "D:/data/1.bmp";
    Mat image = imread(imagePath);
    resize(image, image, Size(1024, 1024));
    namedWindow("TestOpenCV", 0);
    imshow("TestOpenCV", image);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

这段测试代码简单地读入一张图片,然后做个resize,然后将其显示出来,道理上讲前面配置没问题的话,这里不论是Debug模式还是Release模式都能正常运行。

  • 17
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值