CMAKE的使用(一)

使用PKG-CONFIG 鏈接OpenCV的一個(gè)例子


測試平臺:Linux,MacOS
Windows上需要Cygwin或是msys2,powershell/cmd可能不行,后續(xù)會附上一種比較通用的方式:即CMake更新到3.0之后的版本可用的面向target編程。

  1. 最低版本需求
cmake_minimum_required(VERSION 3.0.0)
  1. 設(shè)置工程名稱
project(main)
  1. 設(shè)置編譯器為g++
set(CMAKE_CXX_COMPILE "g++")
  1. 提供編譯器參數(shù)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -O0 -Wall -g ")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O3 -Wall") # Release

# 提示編譯信息
message(STATUS "當(dāng)前編譯模式:" ${CMAKE_BUILD_TYPE} "(默認(rèn)模式:Debug)")
message(STATUS "可在\"-DCMAKE_BUILD_TYPE=\"后面輸入編譯模式(Debug/Release)")

# 舉例:搜索Python庫,如果工程采用與Python混合編譯則需要
# 請安裝Python-dev
find_package(Python3 REQUIRED)
  1. 尋找pkg-config,其實(shí)是找到與之相關(guān)的.cmake文件
find_package(PkgConfig REQUIRED)
  1. 利用pkg-config尋找opencv4.pc這個(gè)文件。OpenCV 4之前的版本只需要輸入opencv即可(opencv.pc)
pkg_check_modules(OPENCV REQUIRED opencv4)
  1. 鏈接頭文件,打印頭文件信息
include_directories(./include)                                  #包含當(dāng)前目錄下的include。
include_directories(${OPENCV_INCLUDE_DIRS})                     #OpenCV的頭文件
MESSAGE(STATUS "找到OpenCV頭文件目錄:" ${OPENCV_INCLUDE_DIRS})   # 打印找到的頭文件位置
  1. 鏈接庫文件
link_libraries(${OPENCV_LIBRARIES})
MESSAGE(STATUS "找到OpenCV庫文件:" ${OPENCV_LIBRARIES}) 
  1. 設(shè)置源文件目錄
aux_source_directory(./src DIR_SRCS)
  1. 生成可執(zhí)行文件
add_executable(main ${DIR_SRCS})
  • 這里做一個(gè)說明,不是所有的頭文件和庫文件都可以用find_package()來找,部分軟件源碼中可能沒.cmake文件存在;有些軟件可能有.pc的文件存在,則可以使用pkg-config,參見以下使用pkg-config尋找OpenCV的例子:

  • 說明:往往一些源碼庫功能或模塊(例如OpenCV)很多,但是實(shí)際開發(fā)用不到那么多功能可以使用cmake圖形化界面指定要編譯的模塊(部件),生成庫文件。此時(shí)可以使用pkg-config(如果有.pc文件存在)來指定編譯好的頭文件和鏈接庫的位置。

  • 多靈活運(yùn)用find_package()pkg_modules_check()功能避免了輸入很長的絕對路徑,其次在有多個(gè)版本共存的情況下,如果沒有在安裝時(shí)進(jìn)行區(qū)分,可以加入version選項(xiàng)確定版本,這在工程開發(fā)中是很必要的。

  • 類似的,在Windows平臺上有vcpkg(Visual Studio)這個(gè)工具,也是非常實(shí)用的工具。

文件目錄:

Myproject
│
├─include
│    ├─Header1.hpp
│    └─Header2.hpp
├─src
│   ├─source1.cpp
│   ├─source2.cpp
│   └─main.cpp
└──CMakeLists.txt
文件目錄
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容