【CMake保姆级教程】CMake的使用
@TOC
前言
在上节课我们已经讲了CMake
的安装和简单使用,本节课我们来讲解CMake
的命令和他的含义
CMake的使用
CMake
支持大写、小写、混合大小写的命令。如果在编写CMakeLists.txt
文件时使用的工具有对应的命令提示,那么大小写随缘即可,不要太过在意。
注释
注释行
注释行:
其实就是注释一行的内容和我们C/C++的//
一样的功能。
CMake
使用 #
进行行注释,可以放在任何位置。
# 这是一个 CMakeLists.txt 文件
注释块
注释块:
其实就是注释一行或者多行的内容,和我们C/C++的/**/
一样的功能。
CMake
使用 #[[ ]]
形式进行块注释。
#[[ 这是一个 CMakeLists.txt 文件。
这是一个 CMakeLists.txt 文件
这是一个 CMakeLists.txt 文件]]
CMake操作
- 设置CMake的最低版本
cmake_minimum_required(VERSION 3.0.0)#设置cmake最低版本为3.0.0.0
- 定义工程名称,并可指定工程的版本、工程描述、web主页地址、支持的语言(默认情况支持所有语言),如果不需要这些都是可以忽略的,只需要指定出工程名字即可。
定义工程名称语法:
# PROJECT 指令的语法是:
project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>]
[LANGUAGES <language-name>...])
常见的使用如下:
project(test)
- 定义工程会生成一个可执行程序
使用add_executable
定义工程会生成一个可执行程序。
#样式1
add_executable(生成的可执行文件名称 1.c 2.c n.c)#源文件中间使用空格隔开
#样式2
add_executable(生成的可执行文件名称 1.c;2.c;n.c)#源文件中间使用 ";"隔开
共处一室
cmake
测试文件:
cmake_minimum_required(VERSION 3.0.0)
project(test)
add_executable(app main.c func.c)
当源文件像下面这样,在同一个文件夹下,并且生成的cmake
文件也在一个文件夹这就叫共处一室。
未执行cmake前:
├── CMakeLists.txt
├── func.c
└── main.c
使用cmake .
和make
执行后
就会多出很多文件↓
├── app#new file
├── CMakeCache.txt#new file
├── CMakeFiles#new file
│ ├── 3.22.1
│ │ ├── CMakeCCompiler.cmake
│ │ ├── CMakeCXXCompiler.cmake
│ │ ├── CMakeDetermineCompilerABI_C.bin
│ │ ├── CMakeDetermineCompilerABI_CXX.bin
│ │ ├── CMakeSystem.cmake
│ │ ├── CompilerIdC
│ │ │ ├── a.out
│ │ │ ├── CMakeCCompilerId.c
│ │ │ └── tmp
│ │ └── CompilerIdCXX
│ │ ├── a.out
│ │ ├── CMakeCXXCompilerId.cpp
│ │ └── tmp
│ ├── app.dir#new file
│ │ ├── build.make
│ │ ├── cmake_clean.cmake
│ │ ├── compiler_depend.make
│ │ ├── compiler_depend.ts
│ │ ├── DependInfo.cmake
│ │ ├── depend.make
│ │ ├── flags.make
│ │ ├── func.c.o
│ │ ├── func.c.o.d
│ │ ├── link.txt
│ │ ├── main.c.o
│ │ ├── main.c.o.d
│ │ └── progress.make
│ ├── cmake.check_cache
│ ├── CMakeDirectoryInformation.cmake
│ ├── CMakeOutput.log
│ ├── CMakeTmp
│ ├── Makefile2
│ ├── Makefile.cmake
│ ├── progress.marks
│ └── TargetDirectories.txt
├── cmake_install.cmake#new file
├── CMakeLists.txt
├── func.c
├── main.c
└── Makefile#new file
最终可执行程序app
就被编译出来了(这个名字是在CMakeLists.txt中指定的)。
VIP 包房
通过上面的例子可以看出,如果在CMakeLists.txt文件所在目录执行了cmake命令之后就会生成一些目录和文件(包括 makefile 文件),如果再基于makefile文件执行make命令,程序在编译过程中还会生成一些中间文件和一个可执行文件,这样会导致整个项目目录看起来很混乱,不太容易管理和维护,此时我们就可以把生成的这些与项目源码无关的文件统一放到一个对应的目录里边,比如将这个目录命名为build
:
├── build
├── CMakeLists.txt
├── func.c
└── main.c
使用cd build/
命令打开他。
使用cmake ..
命令执行cmake
因为CMakeLists.txt
在上级目录,所以使用cmake ..
。
像这样就是好了。
直接在本目录执行make
命令生成可执行文件
使用tree
命令,得到下面的东西:
├── app
├── CMakeCache.txt
├── CMakeFiles
│ ├── 3.22.1
│ │ ├── CMakeCCompiler.cmake
│ │ ├── CMakeCXXCompiler.cmake
│ │ ├── CMakeDetermineCompilerABI_C.bin
│ │ ├── CMakeDetermineCompilerABI_CXX.bin
│ │ ├── CMakeSystem.cmake
│ │ ├── CompilerIdC
│ │ │ ├── a.out
│ │ │ ├── CMakeCCompilerId.c
│ │ │ └── tmp
│ │ └── CompilerIdCXX
│ │ ├── a.out
│ │ ├── CMakeCXXCompilerId.cpp
│ │ └── tmp
│ ├── app.dir
│ │ ├── build.make
│ │ ├── cmake_clean.cmake
│ │ ├── compiler_depend.internal
│ │ ├── compiler_depend.make
│ │ ├── compiler_depend.ts
│ │ ├── DependInfo.cmake
│ │ ├── depend.make
│ │ ├── flags.make
│ │ ├── func.c.o
│ │ ├── func.c.o.d
│ │ ├── link.txt
│ │ ├── main.c.o
│ │ ├── main.c.o.d
│ │ └── progress.make
│ ├── cmake.check_cache
│ ├── CMakeDirectoryInformation.cmake
│ ├── CMakeOutput.log
│ ├── CMakeTmp
│ ├── Makefile2
│ ├── Makefile.cmake
│ ├── progress.marks
│ └── TargetDirectories.txt
├── cmake_install.cmake
└── Makefile
我们发现app
我们指定的可执行文件就在这里。
我们使用./app
去执行他
这时就执行出我们的东西了
- 点赞
- 收藏
- 关注作者
评论(0)