Cmake入门学习
学习C++时候需要做一个小项目,但是无法使用多目录多文件,上网搜索Cmake没用很详细的文字讲解,看过一个up主的视频之后,学习了如何去使用Cmake来进行简单的编译项目。Cmake基本使用
视频在结尾
1.安装
可以去两个网站下载:
官网(可能需要魔法):CMake
之后下载即可,作者这里已经安装,不做演示
GitHub: CMake (github.com)
github安装
接着在vscode中找到两个插件:Cmake和Cmake Tools,安装Cmake自动安装Cmake Tools
2.基本使用
如果碰到
2.1单目录多文件编译
创建一个CMakeLists.txt文件,并与main.cpp保存在同一个目录下
目录结构如下:
.vscode
文件夹是配置调试功能的
接着打开CMakeLists.txt
文件进行编写
# CMake最低版本号要求
cmake_minimum_required(VERSION 3.1)
# 项目信息
project(Demo1) # 写入工程名
# 指定生成目标
# 生成exe文件名,需要编译的源函数文件名称
add_executable(my_cmake_workerManger main.cpp workerManger.cpp)
CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的。#
符号 后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。
对于上面的 CMakeLists.txt 文件,依次出现了几个命令:
cmake_minimum_required
:指定运行此配置文件所需的 CMake 的最低版本;project
:参数值是 ,该命令表示项目的名称是 :Demo1
add_executable
: 将名为 main.cpp 的源文件编译成一个名称为 Demo1 的可执行文件。
2.1.1编译项目
在vscode执行,需要使用ctrl+shift+p
来执行配置
在执行配置之后,会生成一个build
的文件夹,里面会有一些配置文件
生成build
之后,在终端使用cd build
文件夹,进入build
,执行cmake ..
命令
注意:如果电脑上已经安装了VS,应该会调用微软MSVC编译器,使用(cmake -G "MinGW Makefiles" ..)代替(cmake ..)即可。
仅第一次使用cmake时使用(cmake -G "MinGW Makefiles" ..) 后面可使用(cmake ..)
结果如下:
PS E:E:\Program\program\C++\VSC_C++_Projects\Project1> cd .\build\
PS E:E:\Program\program\C++\VSC_C++_Projects\Project1\build> cmake ..
-- Configuring done
-- Generating done
-- Build files have been written to: E:/Program/program/C++/VSC_C++_Projects/Project1/build
PS E:E:\Program\program\C++\VSC_C++_Projects\Project1\build>
接着在命令行输入mingw32-make.exe
,编译文件链接文件,结果如下:
文件结构如下,生成了my_cmake_workerManger.exe
3.2 多目录,多个源文件(推荐)
创建一个include
目录,用于存放头文件,创建一个src目录,用来存放源文件,在创建一个bin目录,将生成的可执行文件存放到这里;将workerManger.cpp
,移动到src目录,将workerManger.h
移动到include
目录,如下图所示:
并且对于多目录多文件,可以分别在项目根目录以及src目录里各编写一个 CMakeLists.txt 文件方便调用。
打开根目录的CMakeList.txt,写入:
# CMake最低版本号要求
cmake_minimum_required(VERSION 3.1)
# 项目信息
project(Demo) # 工程名
# 指定子目录的CMake源文件
add_subdirectory(src)
添加了一个新命令add_subdirectory
这个是用来指定子目录的CMake源文件。
打开src目录下的CMakeList.txt,写入:
# 如果需要进行调试需要设置这个命令
set(CMAKE_BUILD_TYPE Debug)
# 向工程添加多个特定的头文件搜索路径,路径之间用空格分隔
# 相当于指定g++编译器的-I参数
include_directories (${CMAKE_SOURCE_DIR}/include)
# 把当前目录下的源文件存列表存放到变量SOURCES里
aux_source_directory(. SOURCES)
# 指定生成目标
add_executable(${PROJECT_NAME} ${SOURCES})
# 设置生成目标后exe文件存放位置
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin)
命令解释:
-
set:设置可执行文件的输出路径(EXCUTABLE_OUTPUT_PATH是全局变量)
- EXECUTABLE_OUTPUT_PATH :目标二进制可执行文件的存放位置
-
include_directories:向工程添加多个特定的头文件搜索路径,路径之间用空格分隔;相当于指定g++编译器的-I参数
-
aux_source_directory:把当前目录下的源文件存列表存放到变量SOURCES里
-
${CMAKE_SOURCE_DIR}:最外层
CMakeLists.txt
所在目录 -
${PROJECT_NAME}:指定的项目名称
-
${SOURCES}:调用之前生成的变量SOURCES
接着执行Cmake配置,生成build之后,进入build文件夹,执行cmake ..
接着在命令行输入mingw32-make.exe
,编译文件链接文件,结果如下:
文件结构如下,生成了Demo.exe
总结
Cmake在Linux跟Windows上有一些细节上的问题,但是,因为是在vscode上编译,所以基本命令是不变,注意两个系统的一些细节就行。
如果有写的不对的地方,希望能留言指正,谢谢阅读。
参考:
B站up主:xiaobing1016,点进去是视频;老师教的很好,细节很多,感谢!
cmake 从入门到入土_OceanStar的学习笔记的博客-CSDN博客
Linux下CMake简明教程_爱就是恒久忍耐的博客-CSDN博客_cmake 超级详细的教程,可以去看看!