欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用CMake构建OpenCV项目过程解析

程序员文章站 2022-07-08 10:58:27
项目结构为了使整个项目更加条理,我们的文件夹采用如下组织方式:binbuildcmakelists.txtsrc其中bin目录用于放编译生成的可执行文件,build目录用于cmake构建项目,src用...

项目结构

为了使整个项目更加条理,我们的文件夹采用如下组织方式:

bin
build
cmakelists.txt
src

其中bin目录用于放编译生成的可执行文件,build目录用于cmake构建项目,src用于放源代码。

使用CMake构建OpenCV项目过程解析

opencv源文件

下面是我们写的一个opencv示例代码:

这是一个很简单的例子:读取图片然后转化成灰度图。  

编写cmake文件

cmake文件的文件名cmakelists.txt有严格的大小写要求,注意不要写错。

# project name
project(opencv_test)
# requirement of cmake version
cmake_minimum_required(version 3.5)

# set the directory of executable files
set(cmake_runtime_output_directory ${project_source_dir}/bin)

# find required opencv
find_package(opencv required)
# directory of opencv headers
include_directories(${opencv_include_dirs})
# name of executable file and path of source file
add_executable(opencv_test src/opencv_test.cpp)
# directory of opencv library
link_directories(${opencv_library_dirs})
# opencv libraries
target_link_libraries(opencv_test ${opencv_libs})

project指令的语法是:

project(projectname [cxx] [c] [java])

你可以用这个指令定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的.

这个指令隐式的定义了两个cmake变量:

  • <projectname>_binary_dir 构建路径
  • <projectname>_source_dir 工程路径,即cmakelists.txt所在的路径。  

接下来是设置cmake要求的最低版本号:

cmake_minimum_required(version 3.5)

  set指令的语法是:

set(var [value] [cache type docstring [force]])

现阶段,你只需要了解set指令可以用来显式的定义变量即可。这里我们将变量cmake_runtime_output_directory定义为${opencv_test_source_dir}/bin也就是工程路径下的bin目录。 

find_package指令 

find_package这个指令以被用来在系统中自动查找配置构建工程所需的程序库。在linux和unix类系统下这个命令尤其有用。cmake自带的模块文件里有大半是对各种常见开源库的find_package支持,支持库的种类非常多。

当它找到opencv程序库之后,就会帮助我们预定义几个变量,opencv_found、opencv_include_dirs、opencv_library_dirs、opencv_libraries,它们分别指是否找到opencv,opencv的头文件目录,opencv的库文件目录,opencv的所有库文件列表。接着我们就可以使用这些变量来配置了:

include_directories(${opencv_include_dirs})

这个指令用来设置包含的头文件的路径。

link_directories(${opencv_library_dirs})

这个指令用来设置库文件的路径。

target_link_libraries(opencv_test ${opencv_libs})

这个指令用来设置需要的库文件,它的语法是:

target_link_libraries(target library1<debug | optimized> library2...)

其中的target就是前面设置生成的目标文件(可执行文件):

add_executable(opencv_test src/opencv_test.cpp)

这个命令很好理解,首先是可执行文件的名字,然后是源码的名字。因此,这个命令一定要在target_link_libraries之前使用。

现在我们的cmakelists.txt就介绍完了。

构建项目

进入build目录,然后开始构建:

cd build
cmake ..

因为cmakelists.txt在buil的父目录中,因此make命令之后使用..。

然后编译生成可执行文件:

make

运行生成的可执行文件以测试我们是否成功,该程序需要传递一个命令行参数。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。