cmake 基础
cmake主要是生成Makefile,以便工程管理,只需要编写CMakeLists.txt
安装camke
sudo apt install cmake 安装cmake
camke --version 查看cmake版本
sudo apt upgrade cmake 升级cmake
源码隔离
在工程文件下创建一个build文件,进入到build目录下进行*cmake …*就可以将产生的中间文件进行隔离开,并且源文件的结构没有影响,最后生成的可执行文件生成在bulid下(可以进行指定)
cmake基本语法
1. 多文件编译
语法:
>add_executable(可执行文件 源文件1 源文件2 … …)
假设某可执行文件 main 由多个源码文件编译而成:
add_executable(main main.c a.c b.c)
2. 指定头文件路径
语法:
include_directories(头文件所在路径) --其中文件所在的路径可以是相对路径,也可以是绝对路径
例如现在的目录结构为
在cmake中需要指明对应文件的相对路径或者就对路径
3.设定变量常用的shell命令
语法
set(变量名称,变量值)
在上述例子中使用了预定义变量,来获取当前的Cmakefile.txt的值,这样写的代码可维护,可读性更强
4. 添加子工程目录和编译库文件
语法
如果有一个工程目录下有lib文件夹,其中有源码,需要将其翻译成动态库或者静态库
者其中有两个CMakeLists.txt,其中外层的CMakeLists.txt是负责整个工程,内层的CMakeLists,txt负责指导Makefile如何编译lib中的文件
此时,只需要在 lib/ 下增加一个 CMakeLists.txt 文件即可,其内容如下:(内层)
add_library(a SHARED a.c) #a:生成静态库的名称 参数 所需的源文件
add_library(b STATIC b.c) # 静态库是默认的,此处STATIC 可以不写
STATIC:静态编译
SHARED:动态编译
注意,上述关键字 SHARED 和 STATIC 必须是大写。然后在顶层 CMakeLists.txt 增加该子目录的包含语句
在外层的CMakeLists.txt里面需要调用底层的CMakeLists.txt文件 代码如下:
总结 创建库
(1)对库里的源文件进行编译行为进行知道
(2)顶层cmake调用底层cmake add_subdirectory
(3)指定库文件的路径link_libraries
(3)为需要生成的可执行文件添加库的链接target_link_libraries
5.链接第三方库文件
如果主程序所依赖的库文件在别处
注意:语句 link_directories() 要写在 add_executable() 之前
6.指定工具链
如果项目在特定的平台上,会有交叉编译器,则需要指定工具链
7.设置编译选项
set(CMAKE_C_FLAGS “-O2 -Wl,-rpath=./lib”) # 设定优化等级和运行库所在路径
其中*-WL是指定编译器链接动态库的路径-rpath*r就是run,就是程序在运行时所加载的动态库
8.设定cmake的最低版本
9.设定项目的名称
只可以出现在顶层的CMake中