CMAKE的使用(一)

使用PKG-CONFIG 链接OpenCV的一个例子


测试平台:Linux,MacOS
Windows上需要Cygwin或是msys2,powershell/cmd可能不行,后续会附上一种比较通用的方式:即CMake更新到3.0之后的版本可用的面向target编程。

  1. 最低版本需求
cmake_minimum_required(VERSION 3.0.0)
  1. 设置工程名称
project(main)
  1. 设置编译器为g++
set(CMAKE_CXX_COMPILE "g++")
  1. 提供编译器参数
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 "当前编译模式:" ${CMAKE_BUILD_TYPE} "(默认模式:Debug)")
message(STATUS "可在\"-DCMAKE_BUILD_TYPE=\"后面输入编译模式(Debug/Release)")

# 举例:搜索Python库,如果工程采用与Python混合编译则需要
# 请安装Python-dev
find_package(Python3 REQUIRED)
  1. 寻找pkg-config,其实是找到与之相关的.cmake文件
find_package(PkgConfig REQUIRED)
  1. 利用pkg-config寻找opencv4.pc这个文件。OpenCV 4之前的版本只需要输入opencv即可(opencv.pc)
pkg_check_modules(OPENCV REQUIRED opencv4)
  1. 链接头文件,打印头文件信息
include_directories(./include)                                  #包含当前目录下的include。
include_directories(${OPENCV_INCLUDE_DIRS})                     #OpenCV的头文件
MESSAGE(STATUS "找到OpenCV头文件目录:" ${OPENCV_INCLUDE_DIRS})   # 打印找到的头文件位置
  1. 链接库文件
link_libraries(${OPENCV_LIBRARIES})
MESSAGE(STATUS "找到OpenCV库文件:" ${OPENCV_LIBRARIES}) 
  1. 设置源文件目录
aux_source_directory(./src DIR_SRCS)
  1. 生成可执行文件
add_executable(main ${DIR_SRCS})
  • 这里做一个说明,不是所有的头文件和库文件都可以用find_package()来找,部分软件源码中可能没.cmake文件存在;有些软件可能有.pc的文件存在,则可以使用pkg-config,参见以下使用pkg-config寻找OpenCV的例子:

  • 说明:往往一些源码库功能或模块(例如OpenCV)很多,但是实际开发用不到那么多功能可以使用cmake图形化界面指定要编译的模块(部件),生成库文件。此时可以使用pkg-config(如果有.pc文件存在)来指定编译好的头文件和链接库的位置。

  • 多灵活运用find_package()pkg_modules_check()功能避免了输入很长的绝对路径,其次在有多个版本共存的情况下,如果没有在安装时进行区分,可以加入version选项确定版本,这在工程开发中是很必要的。

  • 类似的,在Windows平台上有vcpkg(Visual Studio)这个工具,也是非常实用的工具。

文件目录:

Myproject
│
├─include
│    ├─Header1.hpp
│    └─Header2.hpp
├─src
│   ├─source1.cpp
│   ├─source2.cpp
│   └─main.cpp
└──CMakeLists.txt
文件目录

你可能感兴趣的:(CMAKE的使用(一))