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_DIRS
和OpenCV_LIBS
等變數,因而可以使用 include_directories
和target_link_libraries
來訪問這兩個變數。
可以通過開啟terminal輸入locate OpenCVConfig.cmake
來找到這個.cmake
檔案,用以確認系統確實安裝了OpenCV.
第二種使用link_libraries(opencv庫名的方法)
既然我們知道了find_package的作用是找到字尾名為.cmake
通過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()了
-
在寫程式碼過程中發現的東西
-
link_directories()
單單用這條命令基本沒什麼意義。一般這裡面填寫的引數之前也在$PATH中包含了。 -
link_libraries
裡面可以有多個庫的名字。 -
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)的功能
-
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連結