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. C语言:渔夫捕鱼算法问题

    题目:渔夫捕鱼 A,B,C,D,E五个渔夫夜间合伙捕鱼,,第二天清A先醒来,他把鱼均分五份,把多余的一条扔回湖中,便拿了自己的一份回家了,B醒来后,也把鱼均分五份,把多余的一条扔回湖中,便拿了自己的一 ...

  2. JDK源码阅读-------自学笔记(十八)(java.lang.Enum枚举类)

    枚举类简介 如果有必要定义一组常量的时候使用 所有的枚举类型隐性地继承自 java.lang.Enum,枚举实质上还是类. 每一个枚举中的成员,就相当于枚举的一个对象,默认都是public stati ...

  3. .NET周刊【5月第2期 2024-05-12】

    国内文章 C#在工业数字孪生中的开发路线实践 https://mp.weixin.qq.com/s/b_Pjt2oii0Xa_sZp_9wYWg 这篇文章探讨了C#在工业数字孪生技术中的应用,介绍了三 ...

  4. 4G EPS 第四代移动通信系统

    目录 文章目录 目录 4G EPS 4G EPS 4G(the 4th generation mobile communication technology,第四代移动通信技术)提供了 3G 不能满足 ...

  5. 怀念中的java

    学了这门语言后一直没能做成项目,倒是安装环境,用记事本编辑的话,除了js最好做的就是java了. 以前学java的时候是一帮很有朝气的同学,在一个培训班,每天苦哈哈.从c开始学的语言,学完基础部分转入 ...

  6. Vue 3 组件基础与模板语法详解

    title: Vue 3 组件基础与模板语法详解 date: 2024/5/24 16:31:13 updated: 2024/5/24 16:31:13 categories: 前端开发 tags: ...

  7. phpstorm对laravel开发的配置

    摘自:https://www.cnblogs.com/Richard-Tang/p/10218178.html phpstorm对laravel开发的配置   一.安装Laravel 1.下载comp ...

  8. protoc-gen-go: error:inconsistent package names: , prototest

    如果你已经安装proto ,以及go生成proto插件.但还是报这种错误,请看一下是否 protoc --go_out=./ *.proto 指令打错了

  9. Python依据遥感影像的分幅筛选出对应的栅格文件

      本文介绍基于Python语言,结合已知研究区域中所覆盖的全部遥感影像的分幅条带号,从大量的遥感影像文件中筛选落在这一研究区域中的遥感影像文件的方法.   首先,先来明确一下本文所需实现的需求.现已 ...

  10. ssh 端口转发实验

    为什么会使用端口转发 端口转发的优点: 安全性:通过隐藏实际服务(在这种情况下是监听在22端口的SSH服务)的真实端口号,增加了一层安全性.攻击者可能不知道真正的服务端口号,因此更难进行有针对性的攻击 ...