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
可以指定多种编译类型:Debug
、Release
、RelWithDbgInfo
等
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()
阅读剩余
版权声明:
作者:hywing
链接:https://iotstuff.cn/cmake-imperfection-tutorial/
文章版权归作者所有,未经允许请勿转载。
THE END