Ubuntu中使用cmake链接opencv库的两种方法(opencv3中 base+module动态库的名字也在这里写好了)

第一种使用 find_package的方法

  • 示例代码如下:
# 声明要求的 cmake 最低版本
cmake_minimum_required( VERSION 2.8 )

# 声明一个 cmake 工程
project( pro )

# 设置编译模式
set( CMAKE_BUILD_TYPE "Debug" )

#添加OPENCV库
#指定OpenCV版本,代码如下
#find_package(OpenCV 3.3 REQUIRED)
#如果不需要指定OpenCV版本,代码如下
find_package(OpenCV REQUIRED)

#添加OpenCV头文件
include_directories(${OpenCV_INCLUDE_DIRS})

#显示OpenCV_INCLUDE_DIRS的值
message(${OpenCV_INCLUDE_DIRS})

# 添加一个可执行程序
# 语法:add_executable( 程序名 源代码文件 )
add_executable( main main.cpp )

# 将库文件链接到可执行程序上
target_link_libraries( main  ${OpenCV_LIBS})
  • 代码部分解释

find_package(OpenCV REQUIRED)会在Ubuntu系统中找到OpenCVConfig.cmake,该文件定义了OpenCV_INCLUDE_DIRSOpenCV_LIBS 等变量,因而可以使用 include_directoriestarget_link_libraries来访问这两个变量。

可以通过打开terminal输入locate OpenCVConfig.cmake来找到这个.cmake文件,用以确认系统确实安装了OpenCV.

第二种使用link_libraries(opencv库名的方法)

既然我们知道了find_package的作用是找到后缀名为.cmake的文件,以此来获取其中的引用目录(.h文件的路径)库的路径(例如“ /usr/lib/x86_64-linux-gnu/libopencv_video.so”),那么我们也可以选择直接使用正确路径的引用目录库目录

通过include_directories( your/path/to/OpenCV/include)来正确添加引用目录
通过link_directories( your/path/to/OpenCV/lib) 来添加库的目录
通过link_libraries(name1 name2 name3)来实现库的链接
有了link_libraries(name1 name2 name3),就不需要target_link_libraries(main ${PATH/NAME})了。

  • 示例代码如下(示例中使用的是ROS系统安装的opencv3的路径和库)
cmake_minimum_required( VERSION 2.8 )
project( pro )
set( CMAKE_BUILD_TYPE "Release" )
set( CMAKE_CXX_FLAGS "-std=c++11" )
include_directories(
        "/opt/ros/kinetic/include/opencv-3.3.1-dev/"
)
#添加动态库的路径
link_directories("/opt/ros/kinetic/lib/x86_64-linux-gnu")
#有了上面的路径,下面就可以直接写opencv_aruco3这样的名字了
#opencv_xxxxx不带d和带d分别表示release和debug版本。
link_libraries(
        opencv_aruco3
        opencv_bgsegm3
        opencv_bioinspired3
        opencv_calib3d3
        opencv_ccalib3
        opencv_core3
        opencv_cvv3
        opencv_datasets3
        opencv_dpm3
        opencv_face3
        opencv_features2d3
        opencv_flann3
        opencv_fuzzy3
        opencv_hdf3
        opencv_highgui3
        opencv_imgcodecs3
        opencv_img_hash3
        opencv_imgproc3
        opencv_line_descriptor3
        opencv_ml3
        opencv_objdetect3
        opencv_optflow3
        opencv_phase_unwrapping3
        opencv_photo3
        opencv_plot3
        opencv_reg3
        opencv_rgbd3
        opencv_saliency3
        opencv_shape3
        opencv_stereo3
        opencv_stitching3
        opencv_structured_light3
        opencv_superres3
        opencv_surface_matching3
        opencv_text3
        opencv_tracking3
        opencv_video3
        opencv_videoio3
        opencv_videostab3
        opencv_viz3
        opencv_xfeatures2d3
        opencv_ximgproc3
        opencv_xobjdetect3
        opencv_xphoto3
        )
 #生成程序
add_executable( main main.cpp  )
#不需要target_link_libraries()了
  • 在写代码过程中发现的东西

  1. link_directories()单单用这条命令基本没什么意义。一般这里面填写的参数之前也在$PATH中包含了。

  2. link_libraries里面可以有多个库的名字。

  3. find_library指令也是用来找库进行链接的。用法如下:
    find_library ( name1 [path1 path2 ...])
    find_library官方说明
    示例 find_library(OpenCV_LIBS opencv_aruco3 "/opt/ros/kinetic/lib/x86_64-linux-gnu" )
    意为:在路径/opt/ros/kinetic/lib/x86_64-linux-gnu中寻找名为libopencv_aruco3.so的库,将其命名为OpenCV_LIBS
    正如find_library这个名字所象征的,它只能找一个库,不能同时找多个库,虽然官网有示例说可以加入option实现,但我没有成功。它不能实现类似于aux_source_directory(. SRC)的功能

  4. find_library()由于只是将某个so文件映射为某个指定的变量,比如将/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_aruco3.so映射为OpenCV_LIBS,因而在使用这个libopencv_aruco3.so时,就需要加入target_link_libraries(main ${OpenCV_LIBS})来使这个库成功和main链接

你可能感兴趣的:(c++,opencv,cmake)