CMake快速上手

开发c++或多或少都会涉及linux
这里整理一下CMake的基本操作,快速上手

另外,十分建议在有root权限的linux系统上开发c++,因为很多库和工具在root权限下使用的非常方便,但非root权限就用起来很麻烦(我捣鼓了三四天,最后放弃了)

CMake是为了解决手写makefile非常麻烦的问题,开发出的一个makefile生成工具(事实证明,确实用起来很舒服,生成makefile很方便)

1. CMake安装和升级

直接yum install cmake
如果想升级版本,通过通过下载源码建立软连接的方式 更好(经验之谈)
参考:https://blog.csdn.net/Boys_Wu/article/details/104940575写的挺清楚的,这里就不多介绍了

下载源码包:
wget https://github.com/Kitware/CMake/releases/download/v3.21.4/cmake-3.21.4-linux-x86_64.tar.gz
解压:
tar -xzvf cmake-3.21.4-Linux-x86_64.tar.gz
移动包到/opt目录下:
mv cmake-3.21.4-Linux-x86_64 /opt/cmake-3.21.4  
建立软连接:
ln -sf /opt/cmake-3.21.4/bin/* /usr/bin/   
添加环境变量,重启环境变量
查看版本:
cmake --version

2. CMake编译项目

参考:https://github.com/wzpan/cmake-demo/
内容比较多,我主要从中摘抄几个个人感觉比较重要的点。

  • CMake会通过读取CMakeLists.txt文件来对目标项目进行编译,项目中的CMakeLists.txt文件相当于该项目的CMake配置文件,因此非常重要。
  • 通过cmake .命令可以生成当前目录下的makefile文件。

2.1 单目录编译

当一个简单的项目,所有源码都在一个目录中时,只需要短短几行即可完成单目录下CMake的配置
在目录中创建一个CMakeLists.txt文件,然后内容为

# 指定cmake最低版本
cmake_minimum_required(VERSION 3.21)
# 定义项目名称
project(demo)
# 指定-std=c++11 这个命令不强制, 看起来更清楚
set(CMAKE_CXX_STANDARD 11)

# 找当前目录下所有源文件, 保存到DIR_SRCS中
aux_source_directory(. DIR_SRCS)

# 指定生成目标,即可根据DIR_SRCS生成目标为main的makefile文件
add_executable(main ${DIR_SRCS})

# 添加链接库, 将三方库链接到目标文件中, 这里用pthread举例
target_link_libraries(main pthread)

之后就可以执行cmake ., make, ./main来生成,编译,运行了。

2 多目录编译

多目录编译的方式就比较多了,主要可以通过2种方式。

  • 通过链接子目录的链接库
  • 通过根目录设置目录路径

2.2 多目录编译(1)链接库

在每个目录下都创建一个CMakeLists.txt文件
例如我的目录:
demo/main.cpp
demo/src/add.h
demo/src/add.cpp
分别在demo和src目录下创建CMakeLists.txt文件
在子目录src中写

# 保存当前目录下的源文件到 DIR_SRC_SRCS变量
aux_source_directory(. DIR_SRC_SRCS)
# 生成链接库, 这里会生成src.a链接库文件
add_library (src ${DIR_SRC_SRCS})

然后在根目录下的CMakeLists.txt,增加一个链接子目录的配置项

cmake_minimum_required(VERSION 3.21)
project(demo)
# 指定-std=c++11
set(CMAKE_CXX_STANDARD 11)

# 找当前目录下所有源文件, 保存到DIR_SRCS中
aux_source_directory(. DIR_SRCS)

# 添加src目录, 多了一个添加子目录的配置项
add_subdirectory(src)

# 指定生成目标
add_executable(main ${DIR_SRCS})

# 添加三方链接库和自己的链接库
target_link_libraries(main pthread)
target_link_libraries(main src)

即可完成

2.2 多目录编译(2)

参考:https://blog.csdn.net/dyyzlzc/article/details/105189374
还有另一种写法,只写根目录下的CMakeLists.txt文件,将子目录也放入扫描路径中

cmake_minimum_required(VERSION 3.21)
project(skiplist)
# 指定-std=c++11
set(CMAKE_CXX_STANDARD 11)
# 找不同目录下所有源文件, 保存到不同对象中
aux_source_directory(. DIR_SRCS)
aux_source_directory(./src DIR_SRC_SRCS)

# 指定生成目标
add_executable(main ${DIR_SRCS} ${DIR_SRC_SRCS})

# 添加链接库
target_link_libraries(main pthread)

也可以

补充

几种导包方式, cmake使用gdb调试:
https://zhuanlan.zhihu.com/p/410219342
一个描述cmake入门的详细博客,包括基础命令和进阶语法:
https://zhuanlan.zhihu.com/p/371257515
比较全且详细的基础命令,可以偶尔翻一翻:
https://zhuanlan.zhihu.com/p/367808125

你可能感兴趣的:(C++相关,linux,cmake,makefile)