开发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