CMake入门实例、宏变量说明
创始人
2024-03-21 09:23:59
0

文章目录

  • 前言
  • CMake使用实例
    • 编译可执行程序
    • 编译动态库
  • CMake常用变量说明

前言

本文主要用来记录使用CMake在编译代码时一些常用命令,及过程中注意的点。

CMake官方使用教程文档

CMake使用实例

编译可执行程序

# cmake的最低版本要求
cmake_minimum_required(VERSION 3.8)# 工程名称和版本
project(main VERSION 1.0)# 指定的C++编译器版本是必须的
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 指定为C++14 版本
set(CMAKE_CXX_STANDARD 14)# 为特定程序指定编译属性
set_property(TARGET ${CMAKE_PROJECT_NAME} PROPERTY CXX_STANDARD 14)# 可以添加一个编译的子路径,在子路径中查找CMakeLists.txt文件,并进行编译
# add_subdirectory(test)# 定义Include目录,方便后续建立依赖引用
# 判断运行环境
if(WIN32)set(Camport_DIR c:/camport3)
elseif(UNIX)set(Camport_DIR /home/bing/camport3)
endif()# 查找OpenCV包
find_package(OpenCV)# 输出OpenCV相关信息到编译日志,debug使用(可删除此段)
message(STATUS "OpenCV:")
message(STATUS "  version: ${OpenCV_VERSION}")
message(STATUS "  libraries: ${OpenCV_LIBS}")
message(STATUS "  include path: ${OpenCV_INCLUDE_DIRS}")# 指定包含文件
file(GLOB SOURCE_FILES ${CMAKE_SOURCE_DIR}/*.cpp)# 指定编译文件名及编译可执行文件
add_executable(${CMAKE_PROJECT_NAME} ${SOURCE_FILES})# 对目标的外部库进行链接操作
target_link_libraries (${CMAKE_PROJECT_NAME}${OpenCV_LIBS}${Camport_DIR}/lib/linux/lib_x64/*.so
)# 为指定项目添加 include 路径
include_directories(${PROJECT_SOURCE_DIR}/include${Camport_DIR}/include${Camport_DIR}/sample
)

编译动态库

add_library: 为生成的库添加源文件,是库的名字,直接写名字即可,不要写lib,会自动加上前缀。 STATIC表示静态库(lib),SHARED表示动态库(so)

add_library( [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL]source1 [source2 ...])

CMakeLists.txt实例

# cmake的最低版本要求
cmake_minimum_required(VERSION 3.8)# 工程名称和版本
project(main VERSION 1.0)# 指定的C++编译器版本是必须的
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 指定为C++14 版本
set(CMAKE_CXX_STANDARD 14)# 为特定程序指定编译属性
set_property(TARGET ${CMAKE_PROJECT_NAME} PROPERTY CXX_STANDARD 14)# 定义Include目录,方便后续建立依赖引用
# 判断运行环境
if(WIN32)set(Camport_DIR c:/camport3)
elseif(UNIX)set(Camport_DIR /home/bing/camport3)
endif()# 查找OpenCV包
find_package(OpenCV)# 输出OpenCV相关信息到编译日志,debug使用(可删除此段)
message(STATUS "OpenCV:")
message(STATUS "  version: ${OpenCV_VERSION}")
message(STATUS "  libraries: ${OpenCV_LIBS}")
message(STATUS "  include path: ${OpenCV_INCLUDE_DIRS}")# 指定包含文件
file(GLOB SOURCE_FILES ${CMAKE_SOURCE_DIR}/*.cpp)# 指定编译动态库文件名及动态库类型
add_library(${CMAKE_PROJECT_NAME} SHARED${SOURCE_FILES}
)# 对目标的外部库进行链接操作
target_link_libraries (${CMAKE_PROJECT_NAME}${OpenCV_LIBS}${Camport_DIR}/lib/linux/lib_x64/*.so
)# 为指定项目添加 include 路径
include_directories(${PROJECT_SOURCE_DIR}/include${Camport_DIR}/include${Camport_DIR}/sample
)

CMake常用变量说明

在外部指令中使用 ${} 进行变量的引用。在 IF 等语句中,是直接使用变量名而不通过 ${} 取值。

  1. PROJECT_BINARY_DIR

如果是in source编译,这个变量指得就是工程顶层目录,如果是out-of-source编译,指的是工程编译发生的目录。另外 _BINARY_DIRCMAKE_BINARY_DIR 跟这个变量指代的内容是一致的。

  1. PROJECT_SOURCE _DIR

不论采用何种编译方式,都是工程顶层目录。也就是在in source编译时,他跟PROJECT_BINARY_DIR等变量一致。另外_SOURCE_DIRCMAKE_SOURCE_DIR跟这个变量指代的内容是一致的。

  1. CMAKE_CURRENT_SOURCE_DIR

指的是当前处理的CMakeLists.txt所在的路径。

  1. CMAKE_CURRRENT_BINARY_DIR

如果是in-source编译,它跟CMAKE_CURRENT_SOURCE_DIR一致,如果是out-ofsource编译,他指的是 target 编译目录。使用ADD_SUBDIRECTORY(src bin)可以更改这个变量的值。

  1. CMAKE_CURRENT_LIST_FILE

输出调用这个变量的CMakeLists.txt的完整路径。

  1. CMAKE_CURRENT_LIST_LINE

输出这个变量所在的行。

  1. CMAKE_MODULE_PATH

这个变量用来定义自己的 cmake 模块所在的路径。如果你的工程比较复杂,有可能会自己编写一些 cmake 模块,这些 cmake 模块是随你的工程发布的,为了让 cmake 在处理CMakeLists.txt时找到这些模块,你需要通过 SET 指令,将自己的 cmake 模块路径设置一下。比如
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
这时候你就可以通过 INCLUDE 指令来调用自己的模块了。

  1. EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH

前者用来重新定义目标二进制可执行文件的存放位置,后者用来重新定义目标链接库文件的存放位置。

  1. PROJECT_NAME

返回通过 PROJECT 指令定义的当前项目名称。

  1. CMAKE_PROJECT_NAME
    project(A) add_subdirectory(B) 

返回根项目的项目名称,比如B项目是A项目的子项目,在B项目中获取CMAKE_PROJECT_NAME得到的结果是A,获取PROJECT_NAME得到的结果是B

相关内容

热门资讯

金证股份(600446)披露拟... 截至2025年12月26日收盘,金证股份(600446)报收于15.75元,较前一交易日下跌0.19...
央行:进一步丰富维护金融市场稳... 每经AI快讯,央行网站12月26日消息,中国人民银行近日发布了《中国金融稳定报告(2025)》。下一...
新华鲜报丨利好跨国公司!这项跨... 新华社北京12月26日电(记者刘开雄、吴雨)中国人民银行、国家外汇管理局12月26日发布通知,在总结...
日元空头共识渐成:2026年或... 随着日本央行最新加息举措未能提振汇率,华尔街对日元的看空情绪再度升温,市场正逐渐形成日元将长期疲软的...
北平锋:民进党当局对所谓“两岸... 12月26日,台湾《中国时报》报道,陆委会近日推动所谓“两岸人民关系条例”四项修正,包含:公务员赴陆...
AI核心产业超万亿,工信部将完... 今年,工业经济顶压前行、向新向优发展,展现强大韧性和活力。 12月25日至26日,全国工业和信息化工...
神州泰岳(300002)披露全... 截至2025年12月26日收盘,神州泰岳(300002)报收于11.37元,较前一交易日上涨0.09...
车企起诉电池企业第一案!吉利旗... 出品 | 搜狐汽车·汽车咖啡馆 作者 | 胡耀丹 2024年底发出的回旋镖,在2025年底向欣旺达疾...
海南产经新观察:封关政策释红利... 中新网海南东方12月26日电 (陈英清)“海南自贸港封关运作顺利实施,政策红利持续释放,南繁水稻制种...