【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 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 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 平台