当前位置: 首页 > news >正文

Cmake基础(2)

使用一个简单的示例来应用cmake,无任何三方库的单一的应用程序项目

你可以收获

  • 使用cmake生成VS项目
  • 生成mingw项目(makefile)

1 首先新建一个cpp,我们要做一个控制台应用程序

#include<iostream>
void main(){std::cout<<"hello cmake\n";
}

下面是CMakeLists.txt,要和main.cpp放在同一目录下
当你只有一个文件 main.cpp 并想要生成一个可执行程序时,你的 CMakeLists.txt 文件可以非常简单。以下是一个示例:

# 设置 CMake 最低版本要求
cmake_minimum_required(VERSION 3.12)# 项目名称
project(MyExecutable)# 添加可执行文件
add_executable(my_executable main.cpp)

这个 CMakeLists.txt 文件包含了三个主要部分:

  1. cmake_minimum_required(VERSION 3.12):指定 CMake 的最低版本要求。这个版本号可以根据你的需求进行修改。

  2. project(MyExecutable):定义项目名称。在这里,项目名被设置为 “MyExecutable”,你可以根据需要修改。

  3. add_executable(my_executable main.cpp):添加可执行文件。这一行告诉 CMake 创建一个名为 my_executable 的可执行文件,它的源代码是 main.cpp。确保 main.cpp 文件与 CMakeLists.txt 文件在同一目录下,或者根据实际情况提供正确的路径。

2 在项目目录中创建一个 build 目录,并在其中运行 CMake 和构建命令:

mkdir build
cd build
cmake ..
cmake --build .

这样就会在 build 目录中生成一个名为 my_executable 的可执行文件。
cmake …:配置项目,生成构建系统文件。

cmake --build .:使用生成的构建系统文件实际构建项目。这个可不用执行,因为VS提供可视化的编译。只用打开生成的sln文件,再使用VSbuild。

执行之后

PS E:\workspace\cmake_demo\simple_demo\build> cmake ..
-- Building for: Visual Studio 16 2019
-- Selecting Windows SDK version 10.0.22000.0 to target Windows 10.0.22631.
-- The C compiler identification is MSVC 19.29.30153.0
-- The CXX compiler identification is MSVC 19.29.30153.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: E:/VS/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/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: E:/VS/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (6.3s)
-- Generating done (0.0s)
-- Build files have been written to: E:/workspace/cmake_demo/simple_demo/build
PS E:\workspace\cmake_demo\simple_demo\build> cmake --build .
用于 .NET Framework 的 Microsoft (R) 生成引擎版本 16.11.2+f32259642
版权所有(C) Microsoft Corporation。保留所有权利。my_executable.vcxproj -> E:\workspace\cmake_demo\simple_demo\build\Debug\my_executable.exeBuilding Custom Rule E:/workspace/cmake_demo/simple_demo/CMakeLists.txt
PS E:\workspace\cmake_demo\simple_demo\build>

build 目录下新增了如下文件:

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2023/12/16      2:50                CMakeFiles
d-----        2023/12/16      2:44                Debug
d-----        2023/12/16      2:44                my_executable.dir
d-----        2023/12/16      2:44                x64
-a----        2023/12/16      2:42          38740 ALL_BUILD.vcxproj
-a----        2023/12/16      2:42            290 ALL_BUILD.vcxproj.filters
-a----        2023/12/16      2:44            168 ALL_BUILD.vcxproj.user
-a----        2023/12/16      2:42          13988 CMakeCache.txt
-a----        2023/12/16      2:42           1459 cmake_install.cmake
-a----        2023/12/16      2:42           3126 MyExecutable.sln
-a----        2023/12/16      2:42          48205 my_executable.vcxproj
-a----        2023/12/16      2:42            583 my_executable.vcxproj.filters
-a----        2023/12/16      2:44            168 my_executable.vcxproj.user
-a----        2023/12/16      2:42          38830 ZERO_CHECK.vcxproj
-a----        2023/12/16      2:42            533 ZERO_CHECK.vcxproj.filters

其中ALL_BUILD和ZERO_CHECK是cmake附加的,一个是可以编译所有项目的项目,一个是重新生成VS项目

3 刚刚生成了VS的文件,现在生成makefile文件

使用-G命令来指定编译器
-G <generator-name> = Specify a build system generator.
使用cmake -h来查看帮助,看看编译器的名字

GeneratorsThe following generators are available on this platform (* marks default):Visual Studio 17 2022        = Generates Visual Studio 2022 project files.Use -A option to specify architecture.
* Visual Studio 16 2019        = Generates Visual Studio 2019 project files.Use -A option to specify architecture.MinGW Makefiles              = Generates a make file for use withmingw32-make.
(多余的我就删去了,不然太长)

以下是一个在 MinGW 下使用 Makefile 的示例:

mkdir build_mingw
cd build_mingw
cmake -G "MinGW Makefiles" ..

执行之后:

PS E:\workspace\cmake_demo\simple_demo\build_mingw> cmake -G "MinGW Makefiles" ..
-- The C compiler identification is GNU 8.1.0
-- The CXX compiler identification is GNU 8.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: E:/MinGW/mingw64/bin/gcc.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: E:/MinGW/mingw64/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (2.4s)
-- Generating done (0.0s)
-- Build files have been written to: E:/workspace/cmake_demo/simple_demo/build_mingw

至此以及生成了makefile

然后,你可以使用 mingw32-make 命令来构建项目:
生成了可执行文件

[ 50%] Building CXX object CMakeFiles/my_executable.dir/main.cpp.obj
[100%] Linking CXX executable my_executable.exe
[100%] Built target my_executable

在makefile的环境下因为没有IDE可视化的支持,因此一般将cmake 和make(mingw32-make)连用,在Cmake生成makefile时就指定64位还是32位,debug还是release。
cmake -G "MinGW Makefiles" -DCMAKE_C_FLAGS=-m64 -DCMAKE_BUILD_TYPE=Release ..
64可以换成32,Release 可以换成Debug

后面的文章中在讨论项目配置的问题,这篇文章主要是体会一下cmake生成和编译的步骤

相关文章:

Cmake基础(2)

使用一个简单的示例来应用cmake&#xff0c;无任何三方库的单一的应用程序项目 你可以收获 使用cmake生成VS项目生成mingw项目(makefile) 1 首先新建一个cpp&#xff0c;我们要做一个控制台应用程序 #include<iostream> void main(){std::cout<<"hello cm…...

OSPF理论总结与实验

第1章 OSPF[1] 本章阐述了OSPF协议的特征、术语&#xff0c;OSPF的路由器类型、网络类型、区域类型、LSA类型&#xff0c;OSPF报文的具体内容及作用&#xff0c;描述了OSPF的邻居关系&#xff0c;通过实例让读者掌握OSPF在各种场景中的配置。 本章包含以下内容&#xff1a; …...

浅谈安科瑞无线测温产品在巴西某工厂的应用

摘 要&#xff1a;高压开关设备是变电站和配电站中保证电力系统安全运行的重要设备之一,因此,开关柜的稳定运行对于整个电力系统有非常重要的意义。设备老化、长期高负荷运行都可能使设备局部温度过高而发生火灾&#xff0c;因此,对变电站内的敏感设备进行温度检测变得尤为重要…...

RabbitMQ 命令

Docker # 进入容器 > docker exec -it rabbitmq /bin/bash# 帮助 > rabbitmq-service help# 查看所有队列 > rabbitmqctl list_queues Windows 进入安装目录【D:\Program Files\RabbitMQ Server\rabbitmq_server-3.9.10\sbin】输入cmd # 帮助 > rabbitmq-servic…...

数据库系列之简要对比下GaussDB和OpenGauss数据库

GaussDB作为一款企业级的数据库产品&#xff0c;和开源数据库OpenGauss之间又是什么样的关系&#xff0c;刚开始接触的时候是一头雾水&#xff0c;因此本文简要对比下二者的区别&#xff0c;以加深了解。 1、GaussDB和OpenGauss数据库简要对比 GaussDB是华为基于PostgreSQL数据…...

FFmpeg的AVInputFormat

文章目录 结构体定义操作函数支持的AVOutputFormat 通过上面的分析&#xff0c;基本可以看到ffmpeg的套路了&#xff0c;首先一个context上下文&#xff0c;上下文里面一个priv_data 指针&#xff0c;然后再插件结构体中有一个priv_data_size&#xff0c;然后回调函数。 结构体…...

SQL命令---删除字段

介绍 使用sql语句删除表字段。 命令 alter table 表名 drop 字段名;例子 删除a表中的name字段。 alter table a drop name;下面是执行删除后的表结构&#xff1a;...

深入探讨 Python 中的装饰器和上下文管理器

Python 作为一门灵活而强大的语言&#xff0c;提供了许多高级特性&#xff0c;其中装饰器&#xff08;Decorators&#xff09;和上下文管理器&#xff08;Context Managers&#xff09;是其中两个非常有用的概念。这两个功能性特性提供了对代码结构和行为进行修改和控制的强大工…...

比whatsapp效果好---Google Messages RCS协议消息推送

这段时间由于使用谷歌手机Pixel 7 &#xff08; Android13&#xff09;研究改机room&#xff0c;看了很多相关的资料&#xff0c;测试研究了谷歌生态很多软件功能。结果就是改机Room还没编译成功&#xff0c;反而是测试出Google Messages群发功能的bug&#xff0c;算是一个惊喜…...

HBuilder X

选择一款编程软件有以下几个好处&#xff1a; &#xff08;1&#xff09;提高效率&#xff1a;编程软件通常强调代码编辑和自动完成&#xff0c;可以帮助程序员更快速、更准确地输入代码。 &#xff08;2&#xff09;降低错误率&#xff1a;编程软件还可以检测代码中的错误&a…...

异地现场工控设备,如何实现远程配置、调试?

南京某企业专注于工业物联领域&#xff0c;在相关项目中往往会在各个点位部署基于Linux系统的中控主机&#xff0c;实现各类物联设备信息的采集、汇总。但是&#xff0c;由于各点位分散多地&#xff0c;且数量达到了上百个&#xff0c;虽然中控主机具备4G物联网接入能力&#x…...

C++报错:error C2238: 意外的标记位于“;”之前

报错信息如下&#xff1a; 编译遇见这样的错误信息主要有一下几种&#xff1a; 情况一&#xff1a; 多数情况下出现这种问题的原因是因为头文件重复包含&#xff1a;即头文件A包含了B&#xff0c;头文件B又包含了A&#xff0c;导致编译器在加载头文件时陷入死循环。 解决办法…...

五、Microsoft群集服务(MSCS)环境的搭建

一、【目的】 学会利用Windows Server布置群集环境。 二、【设备】 FreeNAS11.2&#xff0c;Windows Server 2019 三、【要求】 学会利用Windows Server布置群集环境&#xff0c;掌握处理问题的能力。 配置表&#xff1a; 节点公网IP(public)内网IP(private)群集IP(clust…...

通义千问 Qwen-72B-Chat在PAI-DSW的微调推理实践

01 引言 通义千问-72B&#xff08;Qwen-72B&#xff09;是阿里云研发的通义千问大模型系列的720亿参数规模模型。Qwen-72B的预训练数据类型多样、覆盖广泛&#xff0c;包括大量网络文本、专业书籍、代码等。Qwen-72B-Chat是在Qwen-72B的基础上&#xff0c;使用对齐机制打造的…...

web应用体系以及windows网络常见操作应用

本课程目标 1.Dos命令(必须掌握) 2.网络体系(笔试选择填空题) 3.搭建windows测试环境 一、Dos命令 1.DOS窗口启动 启动方式1.进入DOS页面:win+R,键入cmd 启动方式2.开始-运行--输入cmd-回车,此时将出现一个显示命令提示符的窗口,如下图 2、常见的Dos命令: 1、cd…...

FFmpeg 安装配置

FFmpeg 安装配置 依赖包 sudo apt-get install -y autoconf automake bzip2 cmake freetype-devel gcc gcc-c git libtool make mercurial pkgconfig zlib-devel x264-develsudo apt-get install yasm -y安装 wget https://ffmpeg.org/releases/ffmpeg-4.2.3.tar.bz2tar -…...

14:00面试,14:08就出来了,问的问题有点变态。。。。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…...

vue3 添加编辑页使用 cron 表达式生成

示例效果图 1、添加组件 <template><div class"v3c"><ul class"v3c-tab"><li class"v3c-tab-item" :class"{ v3c-active: tabActive 1 }" click"onHandleTab(1)">秒</li><li class&qu…...

洛谷P1722 矩阵Ⅱ——卡特兰数

传送门&#xff1a; P1722 矩阵 II - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1722 用不需要除任何数的公式来求。 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<cstdio> #include<cmath> #includ…...

Unity | Shader基础知识(第六集:语法<如何加入外部颜色资源>)

目录 一、本节介绍 1 上集回顾 2 本节介绍 二、语法结构 1 复习 2 理论知识 3 Shader里声明的写法 4 Properties和SubShader毕竟不是一家人 三、 片元着色器中使用资源 四、代码实现 五、全部代码 六、下集介绍 相关阅读 Unity - Manual: Writing Surface Shaders…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...