为什么要用CLion呢。多个工具多条路,现在美国在搞封闭,万一哪天VS不能用了呢。。。CLion本身只是一个IDE,没有编译器。像Visual Studio就是IDE和编译器一体的,所以安装后即可使用,不用做额外的配置。想要真正把CLion用起来,需要另外配置编译器,我们这里的基调是假设VS不能用,所以编译器不能使用VS,本文使用的是mingw64。下面进入正题
Sources
进行下载,这里下载的是opencv-4.4.0.zip
.msi
后缀的那种,这里下载的是cmake-3.18.4-win64-x64.msi
mingw64官网的名称是mingw-w64,从名称就容易看出来这个编译器支持64位编程。windows下还有一个很容易跟mingw64混淆的编译器,叫MinGW(Minimalist GNU for Windows),MinGW似乎只支持32位。
官网没有下载链接,下载链接在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
增加环境变量,注意你的路径跟我的可能不一样。
配置环境变量后可能需要重启才能生效。
构建和编译OpenCV的过程跟CLion没有关系,只跟编译器mingw64有关。
解压opencv-4.4.0.zip
,我这里解压后的路径是D:\software\opencv-4.4.0
,在此路径下新建一个文件夹build_mingw64
,cmake构建的结果就输出在这个文件夹下(build文件夹可建立在任何地方,之所以建立在opencv解压目录下,为了清楚了解build对应的源代码是哪一份,个人习惯而已)
双击cmake-gui,配置两个路径:
(1)源码路径:D:\software\opencv-4.4.0
(2)构建输出路径:D:\software\opencv-4.4.0\build_mingw64
点击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.dll
和ffmpeg_version.cmake
。需要注意 ffmpeg_version.cmake 点击链接后可能直接打开了链接而不是下载,此时不能使用复制粘贴的方式把信息搞下来,而应该在网页上点右键 -> 另存为
的方式保存文件,然后把后缀.txt干掉,不然MD5校验不通过。
下载好并放入相应文件夹之后,再次点击Configure
进行配置,这次速度会快一些,因为已经配置好的内容会直接跳过去。配置好后上面的一坨红消失了,并且下面日志也不会有诡异的错误。
在上栏中,确保以下几个选项没有被打勾,如果打勾的话可能导致编译失败:
(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
在上栏中,有一个很特别的选项,叫BUILD_opencv_world
,如果勾上的话,编译后会生成一个比较大的dll,如果不打勾的话,则生成一堆零散的dll。
点击Generate
生成工程,这一步通常没有什么坑,并且速度比较快。
D:\software\opencv-4.4.0\build_mingw64
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官网:http://www.jetbrains.com/clion/
CLion目前针对学生、教师、教育机构等等一些个人或组织有免费或打折的license,但对于一般的人并没有类似社区版这样的免费版本,所以需要付费使用。
去官网下载exe后双击安装,没有什么特别需要注意的。
个人习惯在Installation Options
的地方把Add "Open Folder as Project"
勾上。勾上后右键点击文件夹后,弹出菜单会出现Open Folder as CLion Project
,方便打开项目。
打开CLion,第一次打开应该需要激活,但我选择Evaluate for free
选项。
点击New Project
新建个工程,Language standard
根据需求选择,然后点击create
创建项目,进去后应该默认有一个hello world的程序。
如果之前已经把mingw64的路径配进环境变量中了,那么CLion可能能够自己搜索到mingw64并自动配置,但是如果没有自动配置好的话,那么可以按照如下方式配置:依次点击File -> Settings -> Build, Execution, Deployment -> Toolchains
,按下图配置
此时的CLion已经可以写程序,但是只能在Debug模式下写程序,而没有Release模式。
增加Release模式的方法比较简单,在File -> Settings -> Build, Execution, Deployment -> CMake
里设置,在右侧界面点击“+”号,CLion会自动生成Release选项(原本只有Debug),然后点击OK。
然后就可以在主界面选择Debug还是Release了:
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__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
#include
#include
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模式都能正常运行。