第一種使用 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的文件,以此來獲取其中的引用目錄(.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()了
在寫代碼過程中發現的東西
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鏈接