CMake不完全教程

前言

CMake的常见命令及其用法,未完待续

源文件

 CMakeLists.txt

命令行

mkdir build
cd build
cmake . ../
cmake --build . --target install

兼容策略

cmake_policy(SET CMP0092 NEW)

版本依赖

cmake_minimum_required关键字可以指定cmake文件兼容运行的最低版本

cmake_minimum_required(VERSION 3.1.4)

工程信息

project("project-example" VERSION "01.22.00" LANGUAGE "C" DESCRIPTION "iotstuff")

编译类型设置

CMAKE_BUILD_TYPE可以指定多种编译类型:DebugReleaseRelWithDbgInfo

set(CMAKE_BUILD_TYPE "Release")

条件语句

if(<condition>)
  <commands>
elseif(<condition>) 
  <commands>
else()   
  <commands>

循环语句

foreach语句

set(mylist "a" "b" c "d")
foreach(_var ${mylist})
	message("当前变量是:${_var}")
endforeach()

while语句

while(<condition>)
  <commands>
endwhile()

设置变量

定义

set(变量名 变量值 变量类型)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

访问

message(${变量名})
message(${CMAKE_CXX_STANDARD})
message(${CMAKE_CXX_STANDARD_REQUIRED})
message(${CMAKE_CXX_EXTENSIONS})

内置函数或运算符

IN
DEFINED
STREQUAL
EQUAL
EXISTS
NOT
AND
OR

注释

格式:#注释内容

# search for catkin within the workspace

可选配置

option命令用于定义一些开关,一般开关类型有两种状态(ON和OFF),格式如下

option(配置名 配置描述 配置开关)
option(BUILD_CPP_TEST "build cpp test" OFF)

目录包含

格式:include_directories(目录名)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

脚本包含

# include(cmake脚本文件)
include(Application/branding.cmake)

查找软件依赖包

find_package(包名 REQUIERED COMPONENTS 子包名1 子包名2 ...)

添加子工程目录

add_subdirectory(子目录名)

添加自定义宏

格式:add_definitions(-D宏名="自定义值")

add_definitions(-DROS2_VERSION="fox")

添加编译选项

add_compile_option(-g -std=c++11)

执行命令

set(cmd "ls -l")
excute_process(COMMAND ${cmd} RESULT_VARIABLE res OUTPUT_VARIABLE out ERROR_VARIABLE err)

复制文件

如果想要实现文件拷贝功能,可以参考以下格式实现

file(COPY 源文件路径 DESTINATION 目标文件路径)

查找库

find_library命令可用于匹配指定的库(Windows平台貌似只能识别静态库)

find_library(DEMO_LIB NAMES demo PATHS "${CMAKE_CURRENT_SOURCE_DIR}/lib" NO_DEFAULT_PATH)

宏函数定义

macro(<name> [<arg1> ...])
  <commands>
endmacro()

函数定义

function(<name> [<arg1> ...])
	<commands>
endfunction()

添加工程代码文件

add_executable(${PROJECT_NAME} main.cpp demo.cpp demo.h)

工程链接库文件

target_link_libraries(${PROJECT_NAME} 链接库集合)

自定义安装路径

install(TARGETS 目标名 RUNTIME DESTINATION 安装路径)

打印日志

message(STATUS 日志内容)

自动添加匹配文件

FILE(GLOB_RECURSE MVVM_INTERFACE ${CMAKE_SOURCE_DIR}/src/mvvm_interface/*.cpp)
FILE(GLOB_RECURSE VIEW_MODEL ${CMAKE_SOURCE_DIR}/src/view_model/*.cpp)

生成COMPILE文件

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

Qt

qt5 cmake工程配置参考

set(CMAKE_INCLUDE_CURRENT_DIR ON) # 包含当前路径的头文件,用于自动包含ui文件生成的头文件
set(CMAKE_AUTOUIC ON) # 开启uic编译ui文件
set(CMAKE_AUTOMOC ON) # 开启moc编译QObject派生类文件
set(CMAKE_AUTORCC ON) # 自动编译资源文件到可执行文件中去
# 查找Qt5相关模块
find_package(Qt5 COMPONENTS Widgets WebSockets REQUIRED)
qt5_add_resources(qrc_files resource.qrc) # 添加qrc文件
qt5_wrap_ui(ui_files main_window.ui) # 添加ui文件
# 添加源文件、qrc_files等
add_executable(${PROJECT_NAME}
    main.cpp
    main_window.cpp
    ${qrc_files}
    ${ui_files}
)
# 链接Qt5相关模块
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets Qt5::WebSockets)

Ros

catkin

find_package(catkin REQUIRED COMPONENTS
    roscpp
    sensor_msgs
    roslib)

catkin_package(CATKIN_DEPENDS 
	sensor_msgs 
	roslib)

Ros2

ament_cmake

# 查找ros2包依赖
find_package(ament_cmake REQUIRED)
find_package(actionlib REQUIRED)
find_package(actionlib_msgs REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(nav2_msgs REQUIRED)
find_package(nav_msgs REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclpy REQUIRED)
find_package(sensor_msgs REQUIRED)
find_package(std_msgs REQUIRED)
find_package(tf2 REQUIRED)
find_package(tf2_ros REQUIRED)
find_package(std_srvs REQUIRED)
find_package(std_msgs REQUIRED)
find_package(ackermann_msgs REQUIRED)                       
find_package(wheeltec_robot_msg REQUIRED)                     
find_package(serial REQUIRED)
find_package(rosidl_default_generators REQUIRED)

# 自定义msg
rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/Position.msg"
 )
 
ament_target_dependencies(wheeltec_robot_node tf2_ros tf2 rclcpp std_msgs nav_msgs std_srvs sensor_msgs ackermann_msgs serial wheeltec_robot_msg)
ament_package()

阅读剩余
THE END