1. 程式人生 > >Ubuntu中使用cmake連結opencv庫的兩種方法(opencv3中 base+module動態庫的名字也在這裡寫好了)

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 (<VAR> 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連結