CMake
- 随着工程的越来越大,且需要跨平台的应用,
Make工具
也会相对麻烦。因此,2000年,由Kitware公司开发。CMake是一种跨平台的构建系统,它使用一种声明式的构建语言,允许用户通过简单的配置文件来定义项目的结构和编译设置。这一工具的出现极大地简化了项目的构建过程,它可以生成Makefile
或其他构建文件,从而自动化处理编译、链接等复杂任务。CMake支持多种编程语言,如C、C++、Fortran等,并可以轻松地实现跨平台构建,为开发者提供了极大的便利。 - CMake是一个开源的、跨平台的自动化构建系统,它用于控制编译过程,通过使用简单的控制文件和命令来生成标准的构建文件,如
Makefile
或项目文件,进而控制编译过程。CMake不直接构建项目,而是根据CMakeLists.txt文件
(CMake的配置文件)和编译器的信息生成构建文件,然后由Make工具或其他构建工具来执行实际的构建过程。 - CMake的主要目标是使软件的构建过程更加自动化和跨平台,开发者只需要编写
CMakeLists.txt文件
来描述项目的构建规则,CMake就可以根据这个文件生成相应的构建文件,从而在不同的平台上使用不同的编译器进行构建。 - CMake网址:https://cmake.org/
CMakeLists.txt
CMakeLists.txt是CMake的配置文件,用于描述项目的结构、构建规则和依赖关系。该文件位于项目的根目录下,使用CMake语法来定义项目的构建过程。
CMakeLists.txt里常见内容和指令:
- cmake_minimum_required:指定CMake的最低版本要求。
cmake_minimum_required(VERSION <version>)
- project:设置项目的名称和版本。
project(<project_name> VERSION <version>)
- add_executable:定义可执行文件的构建规则。
add_executable(<executable_name> <source_files>)
- add_library:定义库文件的构建规则。
add_library(<library_name> <library_type> <source_files>)
- target_link_libraries:指定目标文件(可执行文件或库文件)所依赖的其他库。
target_link_libraries(<target> <library1> <library2> ...)
- include_directories:指定头文件的搜索路径。
include_directories(<directory1> <directory2> ...)
- find_package:查找和导入外部依赖库。
find_package(<package_name> REQUIRED)
- add_subdirectory:包含子目录的CMakeLists.txt文件。
add_subdirectory(<subdirectory>)
- set:设置变量。
set(<variable> <value>)
- if和endif:条件语句,用于根据条件执行特定的操作。
if(<condition>)
# Actions when condition is true
endif()
- foreach和endforeach:迭代语句,用于遍历列表并执行操作。
foreach(<variable> IN <list>)
# Actions using ${variable}
endforeach()
CMake编译 c++实例
编写简单 c++源码
#include <iostream>
int main() {
std::cout << "Hello, CMake!" << std::endl;
return 0;
}
编写c++的 CMakeLists 文件
cmake_minimum_required(VERSION 3.0)
project(MyProject)
# 将源文件添加到可执行文件
add_executable(MyExecutable src/main.cpp)
编译过程
- 创建
cmake文件夹
,文件夹内部结构目录:
├── CMakeLists.txt
├── build
└── src
└── main.cpp
cd
到build 目录
下,输入cmake ..
命令,输出如下:
cmake ..
CMake Deprecation Warning at CMakeLists.txt:1 (cmake_minimum_required):
Compatibility with CMake < 3.5 will be removed from a future version of
CMake.
Update the VERSION argument <min> value or use a ...<max> suffix to tell
CMake that the project does not need compatibility with older versions.
-- The C compiler identification is AppleClang 15.0.0.15000309
-- The CXX compiler identification is AppleClang 15.0.0.15000309
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (0.6s)
-- Generating done (0.0s)
-- Build files have been written to: /Users/admin/downloads/cmake/build
- 此时在
build 目录
下输入tree 命令
查看生成的文件目录如下:
.
├── CMakeCache.txt
├── CMakeFiles
│ ├── 3.27.1
│ │ ├── CMakeCCompiler.cmake
│ │ ├── CMakeCXXCompiler.cmake
│ │ ├── CMakeDetermineCompilerABI_C.bin
│ │ ├── CMakeDetermineCompilerABI_CXX.bin
│ │ ├── CMakeSystem.cmake
│ │ ├── CompilerIdC
│ │ │ ├── CMakeCCompilerId.c
│ │ │ ├── CMakeCCompilerId.o
│ │ │ └── tmp
│ │ └── CompilerIdCXX
│ │ ├── CMakeCXXCompilerId.cpp
│ │ ├── CMakeCXXCompilerId.o
│ │ └── tmp
│ ├── CMakeConfigureLog.yaml
│ ├── CMakeDirectoryInformation.cmake
│ ├── CMakeScratch
│ ├── Makefile.cmake
│ ├── Makefile2
│ ├── MyExecutable.dir
│ │ ├── DependInfo.cmake
│ │ ├── build.make
│ │ ├── cmake_clean.cmake
│ │ ├── compiler_depend.make
│ │ ├── compiler_depend.ts
│ │ ├── depend.make
│ │ ├── flags.make
│ │ ├── link.txt
│ │ ├── progress.make
│ │ └── src
│ ├── TargetDirectories.txt
│ ├── cmake.check_cache
│ ├── pkgRedirects
│ └── progress.marks
├── Makefile
└── cmake_install.cmake
- 在
build 目录
下输入make
命令,进行编译 c++的过程:
(base) admin@bogon build % make
[ 50%] Building CXX object CMakeFiles/MyExecutable.dir/src/main.cpp.o
[100%] Linking CXX executable MyExecutable
[100%] Built target MyExecutable
- 此时发现在
build
里已经编译出MyExecutable
的可执行文件,在build
目录输入tree
命令:
.
├── CMakeCache.txt
├── CMakeFiles
│ ├── 3.27.1
│ │ ├── CMakeCCompiler.cmake
│ │ ├── CMakeCXXCompiler.cmake
│ │ ├── CMakeDetermineCompilerABI_C.bin
│ │ ├── CMakeDetermineCompilerABI_CXX.bin
│ │ ├── CMakeSystem.cmake
│ │ ├── CompilerIdC
│ │ │ ├── CMakeCCompilerId.c
│ │ │ ├── CMakeCCompilerId.o
│ │ │ └── tmp
│ │ └── CompilerIdCXX
│ │ ├── CMakeCXXCompilerId.cpp
│ │ ├── CMakeCXXCompilerId.o
│ │ └── tmp
│ ├── CMakeConfigureLog.yaml
│ ├── CMakeDirectoryInformation.cmake
│ ├── CMakeScratch
│ ├── Makefile.cmake
│ ├── Makefile2
│ ├── MyExecutable.dir
│ │ ├── DependInfo.cmake
│ │ ├── build.make
│ │ ├── cmake_clean.cmake
│ │ ├── compiler_depend.make
│ │ ├── compiler_depend.ts
│ │ ├── depend.make
│ │ ├── flags.make
│ │ ├── link.txt
│ │ ├── progress.make
│ │ └── src
│ │ ├── main.cpp.o
│ │ └── main.cpp.o.d
│ ├── TargetDirectories.txt
│ ├── cmake.check_cache
│ ├── pkgRedirects
│ └── progress.marks
├── Makefile
├── MyExecutable
└── cmake_install.cmake
运行
- 在 build 目录下输入./MyExecutable,输出结果如下:
Hello, CMake!