CMake简介、语法、常用命令与编译流程
- CMake简介
- 基本语法规则
- CMake 常用命令
- 编译流程
- 报错解决
- 报错一
- CMake卸载
- CMake安装
- 报错二
- 报错三
- 报错四
- 报错五
CMake简介
cmake是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它通过简化构建配置和生成构建文件(如Makefiles、Visual Studio项目或Xcode项目)的过程,使跨平台开发更加容易。CMake提供了广泛的文档和社区支持,使得学习和使用它更加容易。可以通过CMake官方网站获取更多信息和资源。CMake具有以下关键特点:
- 跨平台性:CMake可在多个操作系统上运行,包括Linux、Windows、macOS等,它使用与平台和编译器独立的配置文件来对软件编译过程进行控制,因此可以用于构建跨平台应用程序。
- 生成器:CMake 并不直接构建出最终的软件,而是生成标准的Makefile文件或者VisualStudio项目文件,然后再使用Make或者VisualStudio进行编译。CMake支持生成多种构建工具和集成开发环境(IDE),包括Make、Ninja、Visual Studio、Xcode等,允许开发者选择适合其项目的构建工具。
- 自动检测和配置:CMake能够自动检测系统和库的可用性,从而简化了项目的配置过程。它可以帮助开发者找到所需的依赖项,以便构建项目。
- 模块化和可扩展:CMake的配置是基于模块的,开发者可以编写自定义的CMake模块,以满足其特定需求。这使得CMake非常灵活和可扩展。
- 简洁的CMakeLists.txt文件:项目的配置信息通常存储在CMakeLists.txt文件中,这是一种清晰、易于维护的方式来描述项目的结构和构建规则。
下面是一个简单的CMakeLists.txt文件示例:
cmake_minimum_required(VERSION 3.0)
project(MyProject)
# 添加可执行文件
add_executable(MyApp main.cpp)
# 指定编译器标志
target_compile_options(MyApp PRIVATE -Wall)
# 指定链接的库
target_link_libraries(MyApp mylib)
基本语法规则
- cmake变量使用${}方式取值,但是在IF控制语句中是直接使用变量名
- 环境变量使用$ENV{}方式取值,使用SET(ENV{VAR} VALUE)赋值
- 指令(参数1 参数2…)
参数使用括弧括起,参数之间使用空格或分号分开。
CMake 常用命令
指定cmake的最小版本:
cmake_minimum_required (VERSION 3.0)
设置项目名字:
project(demo)
生成可执行文件:
add_executable(demo demo.cpp)
生成库文件(add_library默认生成静态库,可以显式的控制生成的库的类型):
add_library(common util.cpp)
add_library(common STATIC util.cpp) #生成静态库
add_library(common SHARED util.cpp) #生成动态库或共享库
设置包含目录:
include_directories()
设置链接库搜索目录:
link_directories()
设置需要链接的库:
target_link_libraries()
设置变量:
set(SRC_LIST main.cpp test.cpp)
add_executable(demo ${SRC_LIST})
条件控制:
if(MSVC)
set(LINK_LIBS common)
else()
set(boost_thread boost_log.a boost_system.a)
endif()
target_link_libraries(demo ${LINK_LIBS})
编译流程
- 编写CmakeLists.txt。
- 创建build目录。
- 在build目录中执行命令“cmake PATH”或者“ccmake PATH”生成 Makefile( PATH是CMakeLists.txt所在的目录 )。
- 使用make命令进行编译。(Windows平台的话用Visual Studio打开生成的demo.sln,然后编
译)
以下是一个示例的命令行工作流程:
mkdir build
cd build
cmake ..
make # 或者使用其他构建工具
报错解决
报错一
某些软件包编译时需要高版本的Cmake,因此需要升级Cmake。
CMake卸载
CMake卸载方法有两种:
- 如果CMake是通过
sudo apt-get install cmake
安装的,可以使用以下命令,但是此方法可能会导致之前关联安装的很多库一起被卸载,一定注意查看这些库是否重要
sudo apt-get remove cmake
- 如果CMake是通过源码安装,以上删除方式则不能成功删除,因此对于源码安装的cmake,经实践,首先到cmake的安装目录下找到install_manifest.txt,txt中保存了所有cmake的附属文件的安装目录,将txt中显示的文件全部删除,即可完成对于cmake的卸载。
# 例如,文件安装路径为/usr/local/share/cmake* 、/usr/local/bin/cmake*等,执行以下命令:
sudo rm -rf /usr/local/share/cmake*
通过cmake --version
查看CMake版本信息,即可发现原来的CMake不见了。然后就可以安装所需要版本的CMake。
CMake安装
CMake安装方法有两种:
- 通过
sudo apt-get install cmake
安装 - 通过源码安装,安装方法可以参考以下链接:
jetson nano 升级cmake【Linux】JetsonNano安装CMake
报错二
catkin_make报错:
Could NOT find jsk_recognition_msgs
jsk_recognition是用于JSK实验室的感知包的堆栈,此报错出现的原因是jsk_recognition软件包没有安装,解决方法如下:
# ros版本为melodic,若为其他版本,需要相应修改
sudo apt-get install ros-melodic-jsk-recognition-msgs
sudo apt-get install ros-melodic-jsk-rviz-plugins
报错三
catkin_make报错:
Could not find a package configuration file provided by "uuid_msgs" with
此报错出现的原因是未找到unique_identifier软件包,解决方法如下:
cd src
git clone https://github.com/ros-geographic-info/unique_identifier.git
报错四
catkin_make报错:
glog/logging.h: No such file or directory
此报错出现的原因是libgoogle-glog-dev未安装,解决方法如下:
sudo apt-get install libgoogle-glog-dev
报错五
Cmake报错:
CMake Error: Could not find CMAKE_ROOT !!!
解决方法是清除缓存:
hash -r