2. CMake 的简单使用

我们创建一个工程目录,在里面定义一些简单的加减乘除运算,然后定义一个 main.cpp 的文件:

结构如下:

tree /f .\
D:\SOURCE\CMAKE_PROJ
└─proj1
add.cpp
CMakeLists.txt
div.cpp
head.h
main.cpp
mul.cpp
sub.cpp

其中 header.h 里面放了相关数学运算的定义,这里的代码都不难,主要做演示使用。

如下是 main.cpp 的内容:

#include <iostream>
#include "head.h" // 注释掉这行,就要取消 extern 部分的注释 // extern 提示到别的模块去找函数的具体实现
// extern double mul(const double x1, const double x2);
// extern double add(const double x1, const double x2);
// extern double sub(const double x1, const double x2);
// extern double div(const double x1, const double x2); int main(int argc, char **argv) {
double x1 = 3.14, x2 = 6.18; double add_res = add(x1, x2);
double mul_res = mul(x1, x2);
double sub_res = sub(x1, x2);
double div_res = div(x1, x2); std::cout << add_res << " " << mul_res << " " << sub_res << " " << div_res
<< '\n';
return 0;
}

如果要构建一个可执行文件,我们最开始学的就是使用 g++ 或者 clang++ 直接编译:

g++ -Wall -g main.cpp add.cpp mul.cpp -o main.exe

运行:

.\main.exe
9.32 19.4052 -3.04 0.508091

添加 CMakeLists.txt:在当前工程目录下添加一个文件,CMakeLists.txt

2.1 只有源文件

2.1.1 注释

使用 # 进行行注释,使用 #[[]] 进行块注释

# 这是一个行注释

#[[
这是
一个
块注释]]
cmake_minimum_required(VERSION 3.17)
project(CALC)
add_executable(app add.c div.c main.c mult.c sub.c)

2.1.2 最低版本要求

cmake_minimum_required(VERSION 3.xx): 指定了本地的 CMake 的最低版本(非必须,但建议添加)

cmake_minimum_required(VERSION 3.17)

2.1.3 指定工程信息

project:定义工程名称,并可指定工程的版本、工程描述、web主页地址、支持的语言(默认情况支持所有语言),如果不需要这些都是可以忽略的,只需要指定出工程名字即可。

project(<PROJECT_NAME> [<language-name>...])
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>]
[LANGUAGES <language-name>...])

这里的 [<language-name>] 就是支持构建的语言类型,如 C,C++ 等。

2.1.4 生成可执行程序

add_executable:被定义的工程会生成一个可执行程序

add_executable(可执行程序名 源文件名)
# 可执行程序名:不需要添加后缀,和 project 中的名称没有关系
# 源文件名:所有需要的源文件,可以是一个,也可以是多个

例如本程序中的:

cmake_minimum_required(VERSION 7.17)
project(CALC)
add_executable(calc main.cpp div.cpp sub,cpp mul.cpp add.cpp)

也可以写成如下样式:

add_executable(calc main.cpp;div.cpp;sub,cpp;mul.cpp;add.cpp)

然后我们就可以生成可执行程序了,在这里我们创建一个文件夹:build ,将生成的文件全部放入 build 中,就不会让目录看起来乱糟糟的:

mkdir build
cd build
cmake .. # 对 CMakeList.txt 所在的目录进行访问执行

在 Windows 系统生成的文件上是这样的:

cmake ..
-- Building for: Visual Studio 17 2022
-- Selecting Windows SDK version 10.0.22621.0 to target Windows 10.0.22631.
-- The C compiler identification is MSVC 19.38.33130.0
-- The CXX compiler identification is MSVC 19.38.33130.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: D:/Program Files/Visual Studio/Community/2022/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe - 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: D:/Program Files/Visual Studio/Community/2022/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (3.2s)
-- Generating done (0.0s)
-- Build files have been written to: D:/Source/cmake_proj/proj1/build \tree /f .\build
D:\SOURCE\CMAKE_PROJ\PROJ1\BUILD
│ ALL_BUILD.vcxproj
│ ALL_BUILD.vcxproj.filters
│ CALC.sln
│ calc.vcxproj
│ calc.vcxproj.filters
│ CMakeCache.txt
│ cmake_install.cmake
│ ZERO_CHECK.vcxproj
│ ZERO_CHECK.vcxproj.filters

└─CMakeFiles

可以看到,在 Windows 系统下,默认情况下它生成了一个 Visual Studio 可以打开的工程。当然也可以使用 CLion 或者 Qt Creator 打开当前工程

而在 Linux 下是这样的:

 cmake ..
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /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: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/yuzu/cmake_proj/proj1/build tree ./ -L 1
├── CMakeCache.txt
├── CMakeFiles
├── Makefile
└── cmake_install.cmake 1 directory, 3 files

在Linux 系统下,生成了一个 makefile 文件,还没有生成 calc 的可执行文件,只需要输入如下命令且运行:

make
[ 16%] Building CXX object CMakeFiles/calc.dir/main.cpp.o
[ 33%] Building CXX object CMakeFiles/calc.dir/div.cpp.o
[ 50%] Building CXX object CMakeFiles/calc.dir/sub.cpp.o
[ 66%] Building CXX object CMakeFiles/calc.dir/mul.cpp.o
[ 83%] Building CXX object CMakeFiles/calc.dir/add.cpp.o
[100%] Linking CXX executable calc
[100%] Built target calc

此时查看生成的文件,:

ls
CMakeCache.txt CMakeFiles Makefile calc cmake_install.cmake

执行该二进制文件

./calc
9.32 19.4052 -3.04 0.508091

所以通过这种方式构建工程是没有问题的。

当然,这种 CMakeLists 文件是最简单的,但是具体工程中我们很难将所有的文件都写出来,而要采用一些其他的方式。

更新:

现代 CMake 提供了更方便的 -B--build 指令,不同平台,使用统一的命令:

cmake -B build
# 在源码目录中用 -B 直接创建 build 目录并生成 build/Makefile cmake -build build -j4
# 自动调用本地的构建系统在 build 里构建,即:make -C build -j4 sudo cmake --build build --target install
# 调用本地的构建系统执行 install 这个目标,即安装
  • cmake -B build 免去了创建 build 再切换进去指定源代码的麻烦

  • cmake --build build 统一了不同平台(Linux 上会调用 make,Windows 上调用 devenv.exe)

2. CMake 的简单使用的更多相关文章

  1. cmake 的简单使用示例

    https://www.zybuluo.com/khan-lau/note/254724 CMake 用法导览 Preface : 本文是CMake官方文档CMake Tutorial (http:/ ...

  2. cmake 简单build和删除

    mkdir build cd build cmake .. make

  3. Clion cmake 一个简单的 C++ 程序

    CMakeLists.txt cmake_minimum_required(VERSION 3.5) project(dll) set(CMAKE_CXX_FLAGS "${CMAKE_CX ...

  4. Qt5 CMake项目简单模板

    cmake_minimum_required(VERSION 3.5) project(test VERSION 0.1 LANGUAGES CXX) set(CMAKE_INCLUDE_CURREN ...

  5. c++ cmake及包管理工具conan简单入门

    cmake是一个跨平台的c/c++工程管理工具,可以通过cmake轻松管理我们的项目 conan是一个包管理工具,能够自动帮助我们下载及管理依赖,可以配合cmake使用 这是一个入门教程,想深入了解的 ...

  6. CMake学习笔记

    C++开发者必备技能CMake  先简单介绍一下,CMake是一个跨平台的编译工具,它可以根据不用的平台,不同的编译环境,生成不同的MakeFile,从而控制编译的过程. 使用CMake的步骤: 1. ...

  7. 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  8. linux 下cmake 编译 ,调用,调试 poco 1.6.0 小记

    上篇文章 小记了: 关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记. http://www.cnblogs.com/bleachli/p/4352 ...

  9. 【转载】cmake编写

    Cmake的输入是在源码目录下的CMakeLists.txt文件.这个文件可以用include或者 add_subdirectory 命令增加入其它的输入文件. 语法 CMakeList.txt文件是 ...

  10. 【转载】CMake 简介和 CMake 模板

    转载自我的博客: CMake 简介和 CMake 模板 . 如果你用 Linux 操作系统,使用 cmake 会简单很多,可以参考一个很好的教程: CMake 入门实战 | HaHack .如果你用 ...

随机推荐

  1. 能碳双控| AIRIOT智慧能碳管理解决方案

    在当前全球气候变化和可持续发展的背景下,建设能碳管理平台成为组织迎接挑战.提升可持续性的重要一环,有助于组织实现可持续发展目标,提高社会责任形象,同时适应未来碳排放管理的挑战.能碳管理是一个涉及跟踪. ...

  2. AIRIOT物联网低代码平台如何配置db-driver驱动?

    设备接入能力包括接入驱动类型及接入数据量,性能方面需要考量数据采集的稳定性和驱动的丰富性等多个因素.用户在选择物联网平台时,往往存在一些误区,比如很关注平台支持的驱动数量,越多越好.市场上确有支持上千 ...

  3. Visual Studio之中文智能提示(IntelliSense本地化)

    要设置中文智能提示,我们就得先了解下IntelliSense. IntelliSense 是一种代码完成辅助工具,可以在不同的集成开发环境 (IDE) 中使用,例如 Visual Studio. 默认 ...

  4. C#的奇技淫巧:利用WinRM来远程操控其他服务器上的进程

      前言:有时候远程服务器的进程你想偷偷去围观一下有哪些,或者对一些比较调皮的进程进行封杀,或者对一些自己研发的服务进行远程手动启动或者重启等,又不想打开远程桌面,只想悄咪咪地执行,那也许下面的文章会 ...

  5. c# - 如何在自定义 System.Text.Json JsonConverter 中使用默认序列化?

    我正在写一个 custom System.Text.Json.JsonConverter将旧数据模型升级到新版本.我已覆盖 Read()并实现了必要的后处理.但是,我根本不需要在 Write()中做任 ...

  6. WPF使用WPFMediaKit/AForge调用摄像头示例 .net core 8.0 也支持

    调用摄像头使我们经常会用到的一个功能,可以根据摄像头捕捉到的图像进行分析处理来做很多的东西,比如电子档案.图像识别.AI分析等等. 本示例中主要介绍Nuget最常用的两个调用摄像头的轮子 WPFMed ...

  7. ansible搭建

    ansible配置步骤 1.创建用户 2.用户提权 3.用户免密 4.cp ansible配置文件 5.配置主机清单 6.修改ansible 用户路径下的配置文件 1.创建用户(都要做) [root@ ...

  8. 『手撕Vue-CLI』拷贝模板

    开篇 经过上篇文章的介绍,实现了可以根据用户选择的模板名称加上对应的版本号,可以下载对应的模板,并且将下载之后的文件存放在用户目录下的 .nue-template文件夹中. 接下来这篇文章主要实现内容 ...

  9. SELinux 安全模型——TE

    首发公号:Rand_cs SELinux 安全模型--TE 通过前面的示例策略,大家对 SELinux 应该有那么点感觉认识了,从这篇开始的三篇文章讲述 SELinux 的三种安全模型,会涉及一些代码 ...

  10. nginx resolver 指定多个DNS (2个DNS)

    nginx resolver 指定多个DNS (2个DNS) 直接在 resolver 后边填2个DNS,中间用空格 location / { resolver 223.5.5.5 114.114.1 ...