系列文章目录
·【Linux下C++开发】第一篇·Linux系统基本操作
·【Linux下C++开发】第二篇·开发环境搭建及gcc编译器
·【Linux下C++开发】第三篇·使用VSCode进行C++开发
·【Linux下C++开发】第四篇·CMake
一、语法特性
基本语法格式:指令(参数1 参数2 … 参数n)
参数使用括号括起;参数之间使用空格或分号分隔
指令不区分大小写,但参数区分大小写。
例如:
set(HELLO hello.cpp) #设置变量HELLO值为hello.cpp
add_executable(hello main.cpp hello.cpp)
ADD_EXECUTABLE(hello main.cpp $(HELLO)) #这一行与上一行等价
变量可以使用${}的方式取值
二、重要指令和CMake常用变量
1.CMake常用指令
1.cmake_minimum_required
作用:指定CMake的最小版本要求
语法:cmake_minimum_required(VERSION versionNumber)
# 声明要求的 cmake 最低版本
cmake_minimum_required(VERSION 2.8)
2.project
作用:定义工程名称,并可指定工程支持的语言
语法:project(projectname [CXX] [C] [Java])
# 声明一个 cmake 工程
project(HelloSLAM)
3.set
作用:显式的定义变量
语法:set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
# 设置编译模式
set(CMAKE_BUILD_TYPE "Debug")
# 定义SRC变量,其值为main.cpp hello.cpp
set(SRC main.cpp hello.cpp
4.include_directories
作用:向工程添加多个特定的头文件搜索路径(相当于g++的-I参数)
语法:include_directories([AFTER] [BEFORE] [SYSTEM] dir1 dir2)
# 指定头文件路径是当前目录下的include文件
include_directories(./include)
5.link_directories
作用:向工程添加多个特定的库文件搜索路径(相当于g++的-L参数)
语法:link_directories(dir1 dir2)
# 将./lib添加到库文件搜索路径
link_directories(./lib)
6.add_library
作用:生成库文件
语法:add_library(libname [SHARED] [STATIC] source1 source2 … sourceN)
# 添加hello库
add_library(hello libHelloSLAM.cpp)
# 共享库
add_library(hello_shared SHARED libHelloSLAM.cpp)
7.add_compile_options
作用:添加编译参数
语法:add_compile_options( …)
add_compile_options(-wall -std=c++1 -o2)
8.add_executable
作用:生成可执行文件
语法:add_executable(exename source1 source2 … sourceN)
# 添加一个可执行程序
add_executable(helloSLAM helloSLAM.cpp)
9.target_link_libraries
作用:为target添加需要链接的库(相当于g++编译中的-l参数)
语法:target_link_libraries(target library1 library2 … )
# 将库文件链接到可执行程序上
target_link_libraries(useHello hello_shared)
10.find_package
作用:查找某一头文件或库文件(在ROS中是功能包),并将查找到的文件存储在变量PACKAGE_INCLUDE_DIRS 和PACKAGE_LIBRARIES (PACKAGE_LIBS) 中。
语法:find_package(PACKAGE [arg])
# 为使用 sophus,需要使用find_package命令找到它
find_package(Sophus REQUIRED)
include_directories(${Sophus_INCLUDE_DIRS})
arg可选参数:
- version和EXACT:version指定的是版本;如果指定EXACT则表示必须完全匹配的版本
- QUIET:表示如果查找失败,不会在屏幕进行输出(但是如果指定了REQUIRED字段,则QUIET无效,仍然会输出查找失败提示语)
- REQUIRED:表示一定要找到包,找不到的话就立即停掉整个cmake
- OPTIONAL_COMPONENTS:找不到也不会让cmake停止执行
2.CMake常用变量
CMAKE_BUILD_TYPE:编译类型(Debug,Release)
# 设置编译模式
set(CMAKE_BUILD_TYPE "Debug")
EXECUTABLE_OUTPUT_PATH:可执行文件输出的存放路径
LIBRARY_OUTPUT_PATH:库文件输出的存放路径
三、CMake编译工程
两种编译规则:
- 包含源文件的子文件夹包含CMakeList.txt文件,主目录的CMakeList.txt通过add_subdirectory添加子目录
- 包含源文件的子文件夹不包含CMakeList.txt文件,子目录的编译规则体现在主目录的CMakeList.txt中
编译流程:
- 手动编写CMakeList.txt
- 执行命令cmake PATH生成Makefile
- 执行命令make进行编译
一般都是新建一个build文件夹,将中间文件都存放在build文件中,而在上层目录存放源文件
在CMakeLists.txt文件中可以加一行这样的代码,来优化程序:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O2 -Wall")