cmake 02 hello_cmake

news2024/11/17 2:41:10

cmake 学习笔记

一个最小化的 cmake 项目

目录结构

F:\2023\code\cmake\hello_cmake>tree /f
卷 dox 的文件夹 PATH 列表
卷序列号为 34D2-6BE8
F:.
│  CMakeLists.txt
│  main.cpp
│
└─.vscode
        launch.json
        tasks.json


F:\2023\code\cmake\hello_cmake>

源码

main.cpp

#include <iostream>

int main()
{
    int a = 1;
    a = 2;
    a = 3;
    a = 4;
    std::cout << "hello world" << std::endl;
    return 0;
}

CMakeLists.txt

# 该项目所需 cmake 的最小版本, 如果 cmake 版本小于设置的版本,  cmake 将停止处理并报错
cmake_minimum_required(VERSION 3.0)

# 设置项目名称和语言
project(hello_cmake CXX)
set(CMAKE_BUILD_TYPE DEBUG)

# 指定 c++ 11
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 使用指定的源文件向项目添加可执行文件
add_executable(${PROJECT_NAME} main.cpp)

如何运行

通常来说, 一个 cmake 的 hello world 的运行步骤如下:

# 创建构建目录
md build
# 进入构建目录
cd build
# 创建 mingw 的 makefile
cmake .. -G "MinGW Makefiles"
# 生成可执行程序
make
# 运行
hello_cmake.exe

但是实际上现在我们可以用一条命令直接搞定

cmake -S . -G "MinGW Makefiles" -B build && cmake --build build

有什么问题

  1. MinGW 其实有问题, 当然也可能是我用的版本不对, 在 vscode 中 debug 的时候看不到变量的值
  2. 如果不能同时在 linux/windows/mac os 下构建, 那么 cmake 的威力砍了一半
  3. 如何与vs code 集成? 我想用 Mingw 怎么办? 我想用 tdm-gcc 怎么办? 我想用 msvc 怎么办?
  4. 如何与vs集成?

windows vscode + tmd-gcc

环境配置

tmd-gcc 的配置参考: https://blog.csdn.net/weixin_48820458/article/details/128069360

vscode 参考:
手把手教会VSCode的C++环境搭建,多文件编译,Cmake,json调试配置( Windows篇)
基于CMake的VSCode下的 C/C++环境搭建_Window篇

建议
vscodecmake 插件和 cmake-tools 插件其实没有什么用, 安装一个CMake Language Support有个语法提示就差不多够了.

操作流程

vscode 配置

首先用 vscode 打开顶层CMakeLists.txt所在目录
然后在 .vscode 中添加如下配置文件
launch.json

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/hello_cmake.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "D:\\program\\tdmgcc\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "Build My Project"
        }
    ]
}

tasks.json

{
    "version": "2.0.0",
    "options": {
        "cwd": "${workspaceFolder}"
    },
    "tasks": [
        {
            "type": "shell",
            "label": "configuration",
            "command": "cmake",
            "args": [
                "-S",
                ".",
                "-G",
                "Unix Makefiles",
                "-B",
                "build"
            ]
        },
        {
            "type": "shell",
            "label": "build",
            "command": "cmake",
            "args": [
                "--build",
                "build",
                "--config",
                "debug"
            ]
        },
        {
            "label": "Build My Project",
            "dependsOn":[
                "configuration",
                "build"
            ]
        }
    ],
}

关于命令行

以下命令均在 vscode 的终端中运行

其实tasks的作用就相当于调用了如下命令:

cmake -S . -G "Unix Makefiles" -B build && cmake --build build --config debug

但是在我的电脑上显示是错误的

F:\2023\code\cmake\hello_cmake>cmake -S . -G "Unix Makefiles" -B build && cmake --build build --config debug
-- The CXX compiler identification is GNU 8.1.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/program/MinGW/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: F:/2023/code/cmake/hello_cmake/build
[ 50%] Building CXX object CMakeFiles/hello_cmake.dir/main.cpp.obj
[100%] Linking CXX executable hello_cmake.exe
[100%] Built target hello_cmake

F:\2023\code\cmake\hello_cmake>

可能是我之前安装过 MinGW , 然后一直读取的旧的 gcc , 但其实我的环境变量已经去掉了MinGW并配置了tdm-gcc,此时我们可以手动设置一个环境变量

F:\2023\code\cmake\hello_cmake>rd /q/s build

F:\2023\code\cmake\hello_cmake>set CXX=D:/program/tdmgcc/bin/g++.exe

F:\2023\code\cmake\hello_cmake>cmake -S . -G "Unix Makefiles" -B build && cmake --build build --config debug
-- The CXX compiler identification is GNU 10.3.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/program/tdmgcc/bin/g++.exe - skipped
-- Detecting CXX compile features       
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: F:/2023/code/cmake/hello_cmake/build
[ 50%] Building CXX object CMakeFiles/hello_cmake.dir/main.cpp.obj
[100%] Linking CXX executable hello_cmake.exe
[100%] Built target hello_cmake

F:\2023\code\cmake\hello_cmake>

debug

此时已经配置正确, vscode终端已经构建的前提下, 直接F5
在这里插入图片描述
现在我们已经可以用 vscode + tdm-gcc + cmake 进行 c艹开发了

windows Visual Studio 2019 + cmake

直接 debug 跑起来

main.cppCMakeLists.txt复制到一个新的文件夹, 然后用 vs2019直接打开这个文件夹, 并耐心等待编译完毕, 编译完毕之后大约如下
在这里插入图片描述

启动项选择可执行文件
在这里插入图片描述

直接 F5
在这里插入图片描述

如何构建 Release

点击管理配置
在这里插入图片描述
或者顶层CMakeLists.txt右键
在这里插入图片描述

点击加号
在这里插入图片描述
选择 x64-Release
在这里插入图片描述
CMakeLists.txtset(CMAKE_BUILD_TYPE DEBUG) 注释掉, 否则无法构建 Release 版本

然后选中 x64-Release F5 即可
注意: 此时如果有断点, 其实依然可以 debug

linux

这个是最简单的

ubuntu@ubuntu-cpp:~/code/cmake/hello_cmake$ ll
total 16
drwxrwxr-x 2 ubuntu ubuntu 4096 Jan 21 04:10 ./
drwxrwxr-x 3 ubuntu ubuntu 4096 Jan 21 04:02 ../
-rw-rw-r-- 1 ubuntu ubuntu  429 Jan 21 04:02 CMakeLists.txt
-rw-rw-r-- 1 ubuntu ubuntu  154 Jan 21 04:09 main.cpp
ubuntu@ubuntu-cpp:~/code/cmake/hello_cmake$ cmake -S . -B build && cmake --build build
-- The CXX compiler identification is GNU 11.3.0
-- 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/ubuntu/code/cmake/hello_cmake/build
[ 50%] Building CXX object CMakeFiles/hello_cmake.dir/main.cpp.o
[100%] Linking CXX executable hello_cmake
[100%] Built target hello_cmake
ubuntu@ubuntu-cpp:~/code/cmake/hello_cmake$ ./build/hello_cmake
hello world
ubuntu@ubuntu-cpp:~/code/cmake/hello_cmake$

上述操作有什么问题

  1. 单文件不具备什么实际意义, 还不如vscode自带的方便
  2. 命令行需要敲的命令有点多了, 我们需要一个执行cmake或者生成cmake然后执行cmake的脚本, 此脚本有两种选择, 一种是windows平台写个bat脚本, linux写个shell脚本, 另一种是统一用python. 简单起见, 本文使用 pyton 脚本
  3. 要通过传参的方式控制debug或release, 而不是修改脚本
  4. 要有单元测试
  5. 构建前后有些必要的操作, 这个也是通过 python 脚本来处理

下一篇:
cmake 03 一个可用的 cmake 工程应当是什么样的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/174688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 集合 笔记

体系 Collection接口 List接口&#xff1a;按照顺序插入数据&#xff0c;可重复 ArrayList实现类&#xff1a;LinkedList实现类&#xff1a; Set接口&#xff1a;不可重复的集合 HashSet实现类 Queue接口&#xff1a;队列 LinkedList实现类ArrayBlockingQueue实现类PriorityQu…

Python CalmAn工具包安装及环境配置过程【Windows】

文章目录CalmAn简介安装要求我的设备1>CalmAn压缩包解压2>conda创建虚拟环境3>requirements依赖包配置&#xff08;包括tensorflow&#xff09;4>caiman安装(mamba install)5>caimanmanager.py install6>PyCharm添加解释器7>Demo演示8>遇到的问题CalmA…

DB SQL 转 ES DSL(支持多种数据库常用查询、统计、平均值、最大值、最小值、求和语法)...

1. 简介 日常开发中需要查询Elasticsearch中的数据时&#xff0c;一般会采用RestHighLevelClient高级客户端封装的API。项目中一般采用一种或多种关系型数据库(如&#xff1a;Mysql、PostgreSQL、Oracle等) NoSQL(如&#xff1a;Elasticsearch)存储方案&#xff1b;不同关系数…

【SAP Abap】X档案:SAP ABAP 中 AMDP 简介及实现方法

SAP ABAP 中 AMDP 简介及实现方法0、前言1、AMDP 简介1.1 代码下沉&#xff08;Code Pushdown&#xff09;1.2 AMDP 是托管数据库过程的容器1.3 AMDP 的优缺点1.4 几种数据库访问方式的区别1.5 几种数据库访问方式的选用1.6 使用的开发工具2、实现方法2.1 AMDP PROCEDURE&#…

Linux自带10种常用性能分析与监控工具

liunx的性能分析与监控这些问题是一个很重要的问题&#xff0c;我们需要解决这个问题就可以借助liunx中的一些工具来帮我们处理掉这个问题&#xff0c;以下将会讲一下目前liunx中常用自带的性能分析与监控工具 Linux自带10种常用性能分析与监控工具1.vmstat2.iostat3.iotop监控…

uniapp cli的使用

uniapp官方文档有很多地方写的不是很明白。写笔记还是非常有必要的。 cli入门 uniapp的cli分为两种&#xff1a;uni cli和hbuilder cli。下面是官方对于两者的定义。官方实际上是更推荐uni cli的。因为官方文档通篇都是介绍uni cli&#xff0c;也是优先介绍uni cli的。hbuild…

Linux系统之Bonding 网卡绑定配置方法

Linux系统之Bonding 网卡绑定配置方法一、检查本地系统环境1.检查系统版本2.查看服务器网卡二、创建网卡配置文件1.进入网卡配置文件目录2.拷贝eth0的网卡配置文件3.修改bond0网卡配置文件4.修改eth1网卡配置文件5.修改eth2网卡配置文件三、创建bonding的配置文件1.编辑bonding…

OneFlow v0.9.0正式发布

今天是 OneFlow 开源的第 903 天&#xff0c;OneFlow v0.9.0 正式发布。本次更新包含 640 个 commit&#xff0c;完整更新列表请查看链接&#xff1a;https://github.com/Oneflow-Inc/oneflow/releases/tag/v0.9.0&#xff0c;欢迎下载体验新版本&#xff0c;期待你的反馈。One…

Java补充内容(Junit 反射 注解)

1 Junit测试 测试分类&#xff1a; 1. 黑盒测试&#xff1a;不需要写代码&#xff0c;给输入值&#xff0c;看程序是否能够输出期望的值。 2. 白盒测试&#xff1a;需要写代码的。关注程序具体的执行流程。 Junit使用&#xff1a;白盒测试 步骤&#xff1a; 定义一个测试类(测试…

机器学习知识总结——18.实现一个简单的K-Means聚类

文章目录引用库生成样本数据训练K-Means实验在上一章节里简要的介绍了无监督学习中聚类的知识点&#xff0c;看的太多理论概念&#xff0c;难免会有点莫名其妙&#xff0c;现在就让我们来实现一个简单的 K-Means 算法&#xff0c;从而从原理上彻底弄明白聚类是怎么工作的。 引…

YOLO v2主要看这些重点

来源&#xff1a;投稿 作者&#xff1a;ΔU 编辑&#xff1a;学姐 往期内容&#xff1a; YOLOv1学习笔记 论文 《YOLO9000:Better, Faster, Stronger》 Joseph Redmon∗†, Ali Farhadi∗† University of Washington∗ , Allen Institute for AI† http://pjreddie.com/…

计算机视觉OpenCv学习系列:第五部分、颜色操作

第五部分、颜色操作第一节、颜色表操作1.查找表LUT(look up table)2.颜色查找表&#xff08;1&#xff09;Gamma校正&#xff08;2&#xff09;OpenCV默认的查找表3.代码练习与测试&#xff08;1&#xff09;多种颜色查找表&#xff08;2&#xff09;滚动条颜色查找表第二节、随…

23种设计模式(十四)——中介者模式【接口隔离】

文章目录 意图什么时候使用中介者真实世界类比中介者模式的实现中介者模式的优缺点亦称:调解人、控制器、Intermediary、Controller、Mediator 意图 用一个中介者对象来封装一系列的对象交互。使得各对象不需要显式地相互引用,从而使其松散耦合,而且可以独立地改变它们之间…

新书预告:人机环境系统智能

东方算计&#xff1a;象者&#xff0c;像也西方计算&#xff1a;逻辑 or 实证人工智能是数学物理的产物&#xff0c;而数学是不完备的&#xff0c;物理仍是在探索中&#xff0c;所以人工智能存在着先天不足&#xff0c;有着大量的脆弱和缺点&#xff0c;具体而言&#xff0c;包…

7、矩阵的创建

目录 一、希尔伯特&#xff08;Hilbert&#xff09;矩阵 二、托普利兹&#xff08;Toeplitz&#xff09;矩阵 三、0&#xff5e;1间均匀分布的随机矩阵 四、标准正态分布随机矩阵 五、魔方矩阵 六、帕斯卡矩阵 七、范德蒙&#xff08;Vandermonde&#xff09;矩阵 MATLA…

机器学习——基本概念

小谈&#xff1a;一直想整理机器学习的相关笔记&#xff0c;但是一直在推脱&#xff0c;今天发现知识快忘却了&#xff08;虽然学的也不是那么深&#xff09;&#xff0c;但还是浅浅整理一下吧&#xff0c;便于以后重新学习。最近换到新版编辑器写文章了&#xff0c;有的操作挺…

跨平台freebasic集锦(1)-安装与概述

目录TIOBE Index for January 2023概述特点BASIC兼容性干净的语法多平台Unicode支持大量内置数据类型用户定义类型&#xff08;UDT&#xff09;默认过程参数值内联汇编Intel语法传统的预处理器支持调试支持创建OBJ、LIB、DLL和控制台或GUI EXE优化代码生成下载安装TIOBE Index …

Java设计模式-迭代器模式、迭代器模式是什么、怎么使用

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 6.9 迭代器者模式 6.9.1 定义 提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象的内部表示 6.9.2 结构 抽象聚合(Aggregate)角色&a…

[创业之路-48] :动态股权机制 -3- 静态股权分配 VS 动态股权分配

静态的股权分配是基础&#xff0c;动态的股权分配才是灵魂&#xff1a;只要你给了固态股权&#xff0c;比如说&#xff0c;股东A在最开始出资100万&#xff0c;占了10%的股份&#xff0c;但是&#xff0c;在后面的工作种&#xff0c;因为能力问题&#xff0c;价值观问题&#x…

回收租赁商城系统功能拆解12讲-会员权益

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格&#xff0c;后台调整最终回收价&#xff0c;用户同意回收后系统即刻放款&#xff0c;用户微信零…