【Linux下C++开发】第四篇·CMake

系列文章目录

·【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编译工程

两种编译规则:

  1. 包含源文件的子文件夹包含CMakeList.txt文件,主目录的CMakeList.txt通过add_subdirectory添加子目录
  2. 包含源文件的子文件夹不包含CMakeList.txt文件,子目录的编译规则体现在主目录的CMakeList.txt中

编译流程:

  1. 手动编写CMakeList.txt
  2. 执行命令cmake PATH生成Makefile
  3. 执行命令make进行编译

一般都是新建一个build文件夹,将中间文件都存放在build文件中,而在上层目录存放源文件
在CMakeLists.txt文件中可以加一行这样的代码,来优化程序:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O2 -Wall")
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值