【C++】5、构建:CMake

2023-11-06

一、概述

CMake 是跨平台构建工具,其通过 CMakeLists.txt 描述,并生成 native 编译配置文件:

  • 在 Linux/Unix 平台,生成 makefile
  • 在苹果平台,可以生成 xcode
  • 在 Windows 平台,可以生成 MSVC 的工程文件

二、实战

// file main.cpp
#include <iostream>
int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

// file CMakeLists.txt
cmake_minimum_required(VERSION 3.25) # 最低的 CMake 版本
project(hello) # 项目名称
set(CMAKE_CXX_STANDARD 17) # 编译使用哪个 C++ 版本
add_executable(hello main.cpp) # add_executable(executable_name ${SRC_LIST}) 可执行文件的名字和源文件列表

在目录下有 main.cpp 和 CMakeLists.txt 两个文件,执行 cmake . 即可输出如下:

-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /cppcodes/HelloWorld

此时会生成 CMakeFiles、CMakeCache.txt、cmake_install.cmake、Makefile 等文件,执行 make 即可使用 Makefile 文件(make VERBOSE=1 可看到详细过程):

Scanning dependencies of target HelloWorld
[ 50%] Building CXX object CMakeFiles/HelloWorld.dir/main.cpp.o
[100%] Linking CXX executable HelloWorld
[100%] Built target HelloWorld

然后生成了可执行文件,执行 ./HelloWorld 即可

2.1 内部构建、外部构建

内部构建:在项目内部,有CMakeList.txt的地方,直接cmake .,比如我们前面讲的简单案例都是最简单的内部构建. 结果你也看见了,就是在项目下面生成了很多的临时文件。

外部构建:不直接在项目下面运行cmake, 而是自己建立一个接受cmake之后的临时文件的文件夹,然后再该文件夹下面调用cmake <CMakeList_path> 来构建.运行 make 构建工程,就会在当前目录(build 目录)中获得目标文件 hello。上述过程就是所谓的out-of-source外部编译,一个最大的好处是,对于原有的工程没有任何影响,所有动作全部发生在编译目录。示例如下:

# tree
-- build # 构建结果的文件夹
-- CMakeLists.txt
-- main.cpp

# 在 build 文件夹中执行 make .. 即可生成结果

2.2 CLion Cmake

Clion CMake tutorial

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】5、构建:CMake 的相关文章

  • MVC 重定向到没有控制器的视图

    希望应该是一个简单的 我创建了一个通用错误视图 当整个站点的操作方法内发生异常时 我想显示该视图 我创建了一个部分页面 所有导航都位于其中 因此我不需要在此视图上使用控制器 那么如何从控制器内的操作方法重定向到它 像这样的东西 HttpPo
  • 必须打开存储才能执行此操作 - System.IO.Packaging.Package

    我正在使用 System IO Packaing Package 类来压缩文件 我的应用程序的多个实例可以同时运行 并读取和保存文件 当处理小文件时 一切似乎都很好 但是当涉及大文件时 如果应用程序的两个实例同时保存 我会收到一个异常 消息
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 没有 Unicode 字节顺序标记。无法切换到 Unicode

    我正在使用 XSD 编写 XML 验证器 下面是我所做的 但是当验证器到达该线时while list Read 它给了我错误 没有 Unicode 字节顺序标记 无法切换到 Unicode 有人可以帮我解决吗 public class Va
  • 如何在 Windows 窗体中运行屏幕保护程序作为其背景?

    如何在 Windows 窗体中运行屏幕保护程序作为其背景 用户还可以在屏幕保护程序运行时与表单控件进行交互 为什么这个 我们有一个案例 需要在用户时运行 Windows Bubbles 屏幕保护程序 可以继续与表单控件交互吗 您可以使用以下
  • F10键没被抓住

    I have a Windows Form and there overriden ProcessCmdKey However this works with all of the F Keys except for F10 I am tr
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • 在“using”语句中使用各种类型 (C#)

    自从C usingstatements只是try finally dispose 的语法糖 为什么它接受多个对象仅当它们属于同一类型时 我不明白 因为它们需要的只是 IDisposable 如果它们都实现 IDisposable 应该没问题
  • c# 如何生成锦标赛括号 HTML 表

    所以我已经被这个问题困扰了三个星期 但我一生都无法弄清楚 我想做的是使用表格获得这种输出 演示 http www esl world net masters season6 hanover sc2 playoffs rankings htt
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 为什么WCF中不允许方法重载?

    假设这是一个ServiceContract ServiceContract public interface MyService OperationContract int Sum int x int y OperationContract
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • 将 bignum 类型结构转换为人类可读字符串的有效方法是什么?

    我有一点问题 为了增长我的 C 知识 我决定尝试实现一个基本的 bigint 库 bigint 结构的核心将是一个 32 位整数数组 选择它们是因为它们适合寄存器 这将允许我在数字之间进行操作 这些操作将在 64 位整数中溢出 这也将适合寄
  • 展开路径中具有环境变量的文件名

    最好的扩张方式是什么 MyPath filename txt to home user filename txt or MyPath filename txt to c Documents and settings user filenam
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 为什么 C# 接口名称前面加上“I”

    这种命名约定背后的基本原理是什么 我没有看到任何好处 额外的前缀只会污染 API 我的想法与康拉德一致response https stackoverflow com a 222502 9898与此相关的question https sta
  • 程序退出后,TcpListener Socket 仍处于活动状态

    当我的程序退出时 我试图停止 TCP 侦听器 我不关心套接字或任何活动客户端套接字上当前活动的任何数据 套接字清理代码本质上是 try myServer Server Shutdown SocketShutdown Both catch E
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows
  • 如何从函数返回矩阵(二维数组)? (C)

    我创建了一个生成宾果板的函数 我想返回宾果板 正如我没想到的那样 它不起作用 这是函数 int generateBoard int board N M i j fillNum Boolean exists True initilize se

随机推荐

  • android 后台服务长时间运行---解决方案

    android 后台服务启动方式 第一种 Activity界面通过Intent启动相关service 等价于 Timer定时器 TimerTask定时任务 第二种 Activity界面通过发生广播启动相关service 等价于 AlarmM
  • java 数据脱敏工具类

    import org apache commons lang3 StringUtils p 脱敏工具 p author ocean version 1 0 0 date 2023 5 4 14 51 public class Encrypt
  • 灰灰-309-射击比赛

    本题目给出的射击比赛的规则非常简单 谁打的弹洞距离靶心最近 谁就是冠军 谁差得最远 谁就是菜鸟 本题给出一系列弹洞的平面坐标 x y 请你编写程序找出冠军和菜鸟 我们假设靶心在原点 0 0 输入格式 输入在第一行中给出一个正整数 N 10
  • Redis 7 第六讲 主从模式(replica)架构篇

    此篇开始进入架构篇范围 艸 理论 即主从复制 master以写为主 Slave以读为主 当master数据变化的时候 自动将新的数据异步同步到其它slave数据库 使用场景 读写分离 容灾备份 数据备份 水平扩容 主从架构 演示案例 注 m
  • C# websocket的使用

    实现背景 有两个设备 A跟B两个冰箱 两者都装有app 现在需要在A上面控制B进行开门 A需要调用服务器接口 然后服务器发送消息控制B开门 此处记录下服务器端实现过程 1 包使用的Fleck 直接去nuget里下载安装即可 2 这一步可忽略
  • 用命令修改宝塔面板修改默认端口

    大家好 我是胸怀像 欢迎关注微信公众号 雄雄的小课堂 前言 下面我们来让incode ai来介绍一下宝塔面板 如下所示 宝塔面板是一款运行在 Linux 操作系统上的免费管理面板 它可以提供给用户如网站部署 数据库管理 文件管理 SSL 证
  • SpringMVC接收复杂参数

    SpringMVC接收复杂参数 1 前言 以前后端这边接收的参数都是比较简单的 直接使用 RequestParam或者 PathVariable在或者用一个对象就可以接收到了 但是最近突然遇到了前端需要传递很复杂数据的情况 以前没有想到过的
  • Linux 安装 redis6.0.8,make 时报错 make[1]: *** [server.o] Error 1 的解决方法

    原因是因为 gcc 版本过低 yum 安装的 gcc 是 4 8 5 的 需要升级 gcc 升级过程如下 yum y install centos release scl yum y install devtoolset 9 gcc dev
  • 虚拟机比较: Multipass,VirtualBox,qemu

    目录 官网 https multipass run install 参考 https zhuanlan zhihu com p 453901901 https www cnblogs com satire p 15681820 html 问
  • 解决Python报错:PermissionError: [Errno 13] Permission denied

    这个错误是因为文件不存在或者文件已经被打开了 导致python没有权限去读写它 建议 先去检查文件是否存在 检查这个文件有没有打开 如果被打开的话 那么python是没有权限对它进行读写的 注意的是 有一些c盘的文件需要管理员授权 当然这个
  • LabVIEW串口通信实际操作

    理论基础 LabVIEW串口通信基础知识 读取串口字节 我们新建一个空白 VI 借助串口调试助手和虚拟串口 在 LabVIEW 中编写的一个最简单的例子 写一个基本的读取串口字节的程序 在程序框图中编程如下 注意这里 串口配置放到循环外 不
  • SpringBoot在静态方法或工具类中注入Bean及配置参数

    场景一 静态方法或工具类中注入Bean 示例 author version 1 0 description 通用工具类型 date 2022 5 22 19 36 public class CommonUtil Autowired priv
  • 论文阅读:CVPR2022 Wavelet Knowledge Distillation: Towards Efficient Image-to-Image Translation

    任务 图像转换 背景分析 生成对抗网络 GAN 在图像到图像的翻译中取得了显著成就 然而 由于参数量巨大 最先进的 GAN 通常存在效率低和内存使用量大的问题 为了应对这一挑战 本文首先从频率的角度研究了 GAN 的性能 结果表明 尤其是小
  • 【图论】最短路算法:Dijkstra、bellman-ford、spfa、Floyd 和拓扑排序

    是AcWing算法基础课关于基本图论算法的笔记 图片和引用来自给出原链接的 参考 AcWing 永远滴神 图来自这里 Dijkstra的使用条件是 边权非负即可 朴素版Dijkstra AcWing 849 Dijkstra求最短路 I 稠
  • MySQL半同步复制

    MySQL半同步复制 MySQL为了容灾数据一致性服务 有几种复制方式 主从复制方式 异步 半同步 lossless半同步复制方式 异步的复制 默认的复制是异步的 即master commit时不等更新被slave接受就向客户端回话应答成功
  • 二蛋赠书一期:《快捷学习Spring》

    文章目录 前言 活动规则 参与方式 本期赠书 快捷学习Spring 关于本书 作者介绍 内容简介 读者对象 获奖名单 结语 前言 大家好 我是二蛋 一个热爱技术 乐于分享的工程师 在过去的几年里 我一直通过各种渠道与大家分享技术知识和经验
  • 125KHz RFID芯片模块及电路替代方案

    125K RFID芯片模块是否可以写数据 以上是125KHz RFID芯片模块的供应商和芯片名称 频段 容量 功能 协议 18000 2 11784 11785协议 集成 RFID 收发器可对 100 到 150 kHz 频率范围内的转发器
  • 你所不知道的面试陷阱,巧妙避开,面试不再步步惊心

    你觉得自己比面试官更机智吗 如果准备充分 其实是可以的 在面试中 面试官有些时候会出一些陷阱题来考验你 这并不是出于恶意 而是希望对应聘者的能力有更加敏锐的判断 以下是10条最有可能难住你的面试陷阱问题以及化解它们的方法建议和回答样例 壹
  • 阿里员工离职换来一条血泪教训:以为当小白兔很安全,是你对职场最大的误解

    大家好 我是彭于晏 最近跟一些朋友见面 提起阿里辞退员工中 很多是职场小 老 白兔 看似温和 其实是组织中的祸患 这让我想起马云在湖畔大学首堂课上曾分享 小公司的成败在于你聘请什么样的人 大公司的成败在于你开除什么样的人 大公司里有很多老
  • 【C++】5、构建:CMake

    文章目录 一 概述 二 实战 2 1 内部构建 外部构建 2 2 CLion Cmake 一 概述 CMake 是跨平台构建工具 其通过 CMakeLists txt 描述 并生成 native 编译配置文件 在 Linux Unix 平台