首页 > 其他分享 >2. CMake 的简单使用

2. CMake 的简单使用

时间:2024-07-15 10:42:01浏览次数:11  
标签:CMake -- double 简单 CXX build 使用 cpp cmake

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)

标签:CMake,--,double,简单,CXX,build,使用,cpp,cmake
From: https://www.cnblogs.com/kobayashilin1/p/18302664

相关文章

  • 1. CMake 概述
    1.CMake概述CMake可以用来构建C/C++工程,可以跨平台。允许开发者指定整个工程的编译流程在CMake没有出来之前,开发者需要手写makefile,但是不同平台下的makefile写法不同,所以移植软件的难度就很大。而CMake可以自动生成本地化的工程文件和makefile,其编译流程如下:蓝色......
  • 3. set 的使用
    3.set的使用因为在实际工程中,我们不会将具体文件全部写出来,这是一件费力不讨好的事情。3.1set定义变量在CMake文件中,默认的变量数据类型是字符串,如果要用别的类型,需要进行转换在上面的例子中一共提供了5个源文件,假设这5个源文件需要反复被使用,每次都直接将它们的......
  • 使用Java实现WebSocket通信
    使用Java实现WebSocket通信大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨如何使用Java实现WebSocket通信,WebSocket是一种在单个TCP连接上进行全双工通信的协议,非常适合实时数据传输。1.WebSocket简介WebSocket协议在Web开发中广泛应用,......
  • 使用Spring Boot集成MyBatis
    使用SpringBoot集成MyBatis大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨如何在SpringBoot项目中集成MyBatis,实现持久化操作与数据库的交互。MyBatis是一个优秀的持久层框架,结合SpringBoot能够快速、高效地开发数据库访问功能。1.集......
  • 使用ML.NET训练一个属于自己的图像分类模型
    思维导航前言ML.NET框架介绍AI和机器学习有什么区别?ML.NET支持的.NET框架框架源代码ML.NET官方提供的使用示例ML.NET使用环境安装创建一个WinForms应用准备好需要训练的图片训练图像分类模型测试训练模型的分析效果在WinForms中调用图像分类模型项目源码地址优......
  • 使用Java实现高并发编程
    使用Java实现高并发编程大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来讨论Java中的高并发编程。Java提供了丰富的并发编程工具和框架,包括线程、线程池、并发集合和锁机制等。本文将通过代码示例详细介绍如何使用这些工具实现高并发编程。1.......
  • Simple WPF: WPF使用Windows API发送Toast通知
    最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。创作不易,如果觉得有用请在Github上为博主点亮一颗小星星吧!以前看到Windows10的气泡通知觉得很有意思,但是一直不知道该如何实现。最近一次上网冲浪过程中偶然的机会看到了相关资料就自己来试试。本文介绍了在WPF......
  • 使用Spring Security实现安全认证
    使用SpringSecurity实现安全认证大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在这篇文章中,我将详细介绍如何使用SpringSecurity实现安全认证。通过丰富的代码示例,帮助大家全面掌握SpringSecurity的核心功能和配置方法。1.SpringSecurity概述Spri......
  • flask 定时任务(APScheduler)使用current_app app_context()上下文
    前言:描述:flask定时任务调用的方法中使用了current_app.logger.info()记录日志报错 报错代码raiseRuntimeError(unbound_message)fromNoneRuntimeError:Workingoutsideofapplicationcontext.Thistypicallymeansthatyouattemptedtousefunctionality......
  • 使用Docker部署mailcow开源邮件系统详细过程
    1.项目介绍项目网站:mailcow:dockerized–Blog根据官方介绍,这个项目名称是mailcow,名称都是小写的。下面内容是通过AI翻译自官方文档:mailcow:dockerizeddocumentationmailcow:dockerized是一个基于Docker的开源组件/电子邮件套件。mailcow依赖于许多广为人知且长期......