cmake (更新中)
概述
关于 CMake
CMake 是一个可扩展的开源系统,以一种与操作系统和编译器无关的方式来管理构建过程。与许多跨平台系统不同,CMake 被设计为与本机构建环境配合使用。在每个源代码目录中放置简单的配置文件(称为 CMakeLists.txt 文件),用于生成标准的构建文件(例如,在Unix上是 makefiles,在Windows MSVC上是项目/工作区文件),然后按照通常的方式使用这些文件。CMake 可以生成本机构建环境,用于编译源代码、创建库、生成封装器以及以任意组合构建可执行文件。CMake 支持就地和独立构建,因此可以从单个源代码树中支持多个构建。CMake 还支持静态和动态库构建。CMake 的另一个好处是它生成一个缓存文件,该文件设计用于与图形编辑器一起使用。例如,当 CMake 运行时,它会定位文件、库和可执行文件,并可能遇到可选的构建指令。这些信息被收集到缓存中,用户可以在生成本机构建文件之前更改这些信息。
CMake 的设计旨在支持复杂的目录层次结构和依赖于多个库的应用程序。例如,CMake 支持由多个工具包(即库)组成的项目,每个工具包可能包含多个目录,应用程序除了依赖于工具包还依赖于其他代码。CMake 还可以处理这样的情况,即必须构建可执行文件以生成然后编译和链接到最终应用程序中的代码。由于 CMake 是开源的,并且具有简单且可扩展的设计,因此可以根据需要扩展以支持新功能。使用 CMake 很简单。构建过程由在构成项目的每个目录中(包括子目录)创建一个或多个 CMakeLists.txt 文件来控制。每个 CMakeLists.txt 由一个或多个命令组成。每个命令的形式为 COMMAND (args...),其中 COMMAND 是命令的名称,args 是一个以空格分隔的参数列表。CMake 提供了许多预定义的命令,但如果需要,也可以添加自己的命令。此外,高级用户可以为特定的编译器/操作系统组合添加其他 makefile 生成器。(目前支持Unix和MSVC++,其他开发人员正在添加其他编译器/操作系统的支持。)你可能希望查阅示例页面以获取更多细节。
起源
CMake 是为了满足 Insight Segmentation and Registration Toolkit (ITK) 的需求而创建的,该工具由美国国立卫生研究院(NLM)资助,作为 Visible Human Project 的一部分。它受到了一个名为 pcmaker 的早期系统的影响,该系统由 Ken Martin 和其他开发人员创建,用于支持开源的 3D 图形和可视化系统 Visualization Toolkit (VTK)。为了创建 CMake,Kitware 公司的 Bill Hoffman 整合了 pcmaker 的一些关键思想,并加入了许多自己的想法,考虑采用 Unix configure 工具的一些功能。最初的 CMake 实现是在 2000 年中期,加速发展发生在 2001 年初。许多改进是因为其他开发人员将 CMake 集成到他们自己的系统中的影响。例如,VXL 软件社区采用了 CMake 作为构建环境,并贡献了许多关键特性。Brad King 添加了几个特性,以支持 CABLE、自动封装环境和 GCC-XML,GE Corporate R&D 需要支持他们的测试基础设施(DART)。还添加了其他特性,以支持将 VTK 的构建环境过渡到 CMake,以及支持 ParaView,这是一个用于支持洛斯阿拉莫斯国家实验室的 Advanced Computing Lab 的并行可视化系统。
特点和用途
-
跨平台支持: CMake可以生成适用于多个操作系统(如Linux、Windows、macOS等)和编译器(如GCC、Clang、Visual Studio等)的构建系统。这使得开发者能够在不同平台上构建项目,而无需重复创建不同的构建文件。
- 简化配置: CMake使用简洁的CMakeLists.txt配置文件来描述项目的结构和依赖关系。这些文件提供了构建目标、源代码文件、编译选项和链接库等信息,使得项目的配置变得清晰和易于维护。
-
自动生成构建系统: CMake允许开发者生成不同类型的构建系统,如Makefiles、Visual Studio项目、Xcode工程等。开发者只需编写一个CMake配置文件,CMake会根据配置自动生成适合的构建文件。
-
模块化结构: CMake支持模块化的项目结构,使得可以将项目拆分为不同的模块和子项目,每个模块都有自己的CMake配置文件。
-
依赖管理: CMake可以查找和管理项目所需的依赖库,包括系统库和第三方库。它可以自动检测依赖库的位置和版本,并确保项目能够正确地链接和使用这些库。
-
定制化构建: 开发者可以根据需要自定义构建过程,包括编译选项、宏定义、生成目标等。
-
外部项目集成: CMake支持集成外部项目,如下载和构建第三方库,使得项目依赖的外部库能够轻松地被整合。
-
插件和扩展: CMake可以使用插件和扩展来增强其功能,如支持静态分析、代码覆盖率测试等。
简单示例
在使用之前需要先安装cmake,下面是在ubuntu的安装示例
sudo apt install cmake

1、示例代码
#include <stdio.h>int main()
{printf("Hello CMake !\n");return 0;
}
2、然后创建一个名为 "CMakeLists.txt" 的文件
放在与源文件同一目录下,内容如下:
# 指定 CMake 最低版本要求
cmake_minimum_required(VERSION 3.10)# 定义项目名称和支持的语言
project(SimpleCMakeExample C)# 添加可执行文件
add_executable(main main.c)
以上内容说明:
cmake_minimum_required(VERSION 3.10) 指定了所需的最低 CMake 版本。我的cmake是3.16 可以满足
project(SimpleCMakeExample CXX) 定义了项目名称(SimpleCMakeExample)和项目支持的语言(C)。
add_executable(main main.cpp) 添加一个名为 "main" 的可执行文件,它由 "main.cpp" 源文件构建而来。
3、构建
mkdir build
cd build
#cmake 构建
cmake ../
#编译
make
这样 就生成了可执行程序main
相关文章:
cmake (更新中)
概述 关于 CMake CMake 是一个可扩展的开源系统,以一种与操作系统和编译器无关的方式来管理构建过程。与许多跨平台系统不同,CMake 被设计为与本机构建环境配合使用。在每个源代码目录中放置简单的配置文件(称为 CMakeLists.txt 文件…...
【go语言基础】指针数组和数组指针
1.概念 (1)指针数组: 存储指针的数组,也叫存储地址的数组,简单说就是存储地址的。 首先它是一个数组,数组中的元素都是指针(地址)。 (2)数组指针…...
ModaHub魔搭社区——Milvus Cloud向量数据库
向量数据库:在AI时代的快速发展与应用 摘要: 随着人工智能技术的不断进步,向量数据库在处理大规模数据方面发挥着越来越重要的作用。本文介绍了向量数据库的基本概念、应用场景和技术挑战,并详细阐述了Milvus Cloud作为典型的向量数据库产品的技术特点、性能优化和应用案例…...
【Java】常用Stream API
常见 Stream 流表达式 总体结构图 一、两大类型 中间操作(Intermediate Operations) 中间操作是指在Stream上执行的操作, 它们返回一个新的Stream, 允许你链式地进行多个中间操作. 终端操作(Terminal Operations) 对Stream进行最终处理的操作, 当调用终端操作时, Stream会开始执…...
P1941 [NOIP2014 提高组] 飞扬的小鸟
代码部分前有一千六百字了 P1941 [NOIP2014 提高组] 飞扬的小鸟 考察对背包 dp 算法过程理解的透彻性。过程透彻性也是解决所有问题的关键(建立在算法已学的基础上)。 n , m n,m n,m 的范围足够我们 O ( n m ) O(nm) O(nm) 的遍历整个地图。设 f i , …...
Vue3+Element plus+pageHelper实现分页
安装element plus npm install element-plus --save引入 修改main.js: import { createApp } from vue import App from ./App.vue import ElementPlus from element-plus import element-plus/dist/index.cssconst app createApp(App) app.use(ElementPlus) ap…...
外贸路上那些哭笑不得的事情
前几天一个老顾客在软件上联系,说自己上次的订货体验很满意,货物的质量很好,而且服务和回复也很及时, 比起他之前的供货商要好很多,他之前的供货商虽然货物的质量也很好,但是每次询问问题都是要等好久才给…...
双端列表 —— Deque 接口概述,使用ArrayDeque实现队列和双端队列数据结构
Deque接口简介 Deque译为双端队列,在双向都能作为队列来使用,同时可用作栈。Deque接口的方法是对称成比例的。 Deque接口继承Queue接口,因此具有Queue,Collection,Iterable的方法属性。 双端队列的工作原理 在常规队…...
构建可观测架构,从这5个方面着手
随着系统复杂度的提升,“可观测性”(Observability)成为架构建设的重要原则之一。那么构建一个可观测的系统架构需要做哪些工作呢?本文将从以下5个方面介绍构建可观测架构的主要考虑: 1.定义指标和度量,明确关键业务指标需求 首先要确定核心业务指标,比如请求响应…...
前端面试的性能优化部分(7)每天10个小知识点
目录 系列文章目录前端面试的性能优化部分(1)每天10个小知识点前端面试的性能优化部分(2)每天10个小知识点前端面试的性能优化部分(3)每天10个小知识点前端面试的性能优化部分(4)每天…...
【云原生】kubernetes中容器的资源限制
目录 1 metrics-server 2 指定内存请求和限制 3 指定 CPU 请求和限制 资源限制 在k8s中对于容器资源限制主要分为以下两类: 内存资源限制: 内存请求(request)和内存限制(limit)分配给一个容器。 我们保障容器拥有它请求数量的…...
java Long型数据返回到前端失进度问题解决
直接在springmvc配置中增加信息转换。亲测可用。简单粗暴 Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {MappingJackson2HttpMessageConverter jackson2HttpMessageConverter new MappingJackson2HttpMessageCo…...
【设计模式】-策略模式:优雅处理条件逻辑
Java 策略模式之优雅处理条件逻辑 前言 在软件开发中,我们经常会遇到根据不同的条件执行不同逻辑的情况。这时,策略模式是一种常用的设计模式,能够使代码结构清晰、易于扩展和维护。 本文将详细介绍策略模式的概念及其在Java中的应用&#x…...
SpringBoot整合多数据源
SpringBoot整合多数据源 在实际企业项目开发中,我们经常会在SpringBoot项目中配置多数据源,一方面可以减缓数据库压力,另一方面可以也是业务需求的场景 下面就来看看如何在SpringBoot项目中配置多数据源 POM 在配置多数据源之前ÿ…...
CLIP论文精度
CLIP论文精度 Zero-shot CLIP多模态模型 Image Endecoder是一个图片编码器,既可以是ResNet,也可以是Vision Transformer. Text Encoder和Image Encoder产生的两组特征进行对比学习(无监督训练) 分类头?“分类头” 是指网络结…...
LouvainMethod分布式运行的升级之路
1、背景介绍 Louvain是大规模图谱的谱聚类算法,引入模块度的概念分二阶段进行聚类,直到收敛为止。分布式的代码可以在如下网址进行下载。 GitHub - Sotera/spark-distributed-louvain-modularity: Spark / graphX implementation of the distri…...
【Node.js】低代码平台源码
一、低代码简介 低代码管理系统是一种通过可视化界面和简化的开发工具,使非专业开发人员能够快速构建和管理应用程序的系统。它提供了一套预先定义的组件和模块,使用户可以通过拖放操作来设计应用程序的界面和逻辑。低代码管理系统还提供了自动化的工作…...
docker 部署 xxl-job-admin
1、先安装mysql docker pull mysql 2、运行mysql 容器 ( 端口 3306 容器名称 mysql 密码 123456 ) docker run -d --name mysql -e MYSQL_ROOT_PASSWORD123456 -p 3306:3306 mysql 3、将tables_xxl_job.sql文件(官网地址:http…...
c++(空间配置器)[32]
空间配置器 一级空间配置器 || 二级空间配置器 默认先走二级然后判断 二级空间配置器 一个指针指向start_free然后start_free向后移动,相当于哈希桶的头删和头插 8byte:切大补小 C的二级空间配置器按照8字节(或者更大的倍数)切分…...
Linux系列之解压文件
一.欢迎来到我的酒馆 使用命令解压Linux文件。 目录 一.欢迎来到我的酒馆二.使用命令解压文件 二.使用命令解压文件 2.1解压 .tar.gz文件: tar -zxvf 文件名.tar.gz.tar,gz这种文件是tar文件的压缩文件,因此可以使用tar命令进行解压 -zxvf命令参数&…...
CLIP-GmP-ViT-L-14从零开始:国产昇腾910B芯片ACL适配部署实践
CLIP-GmP-ViT-L-14从零开始:国产昇腾910B芯片ACL适配部署实践 1. 项目概述 CLIP-GmP-ViT-L-14是一个经过几何参数化(GmP)微调的CLIP模型,在ImageNet和ObjectNet数据集上达到了约90%的准确率。这个模型结合了视觉和语言理解能力,能够计算图像…...
ubuntu(22.04),开启串口永久权限 ,并设置开机自启动文件
1.串口永久权限1.使用CtrlAltt 打开新的终端2. 使用 ls -la /dev 查看进行所有的驱动名称(包含权限与用户)ls -la /dev 3. 找到正确的名称并记住4.使用cd /etc/udev/rules.d/ 进入文件夹下,并使用ls查看所有的文件cd /etc/udev/rules.d/ 5. 使…...
OpenClaw安装 Skill 完整指南:从哪里找、怎么安装到怎么验证
OpenClaw安装 Skill 完整指南:从哪里找、怎么安装到怎么验证 关键词:OpenClaw、OpenClaw Skill、OpenClaw安装Skill、OpenClaw教程、AI智能体、EasyClaw 摘要:很多人开始接触 OpenClaw 后,很快就会遇到一个问题:Skil…...
OpenClaw技能开发入门:为Qwen2.5-VL-7B定制图文处理模块
OpenClaw技能开发入门:为Qwen2.5-VL-7B定制图文处理模块 1. 为什么需要定制技能? 去年夏天,我遇到一个头疼的问题:每天需要处理大量产品截图和说明文档的匹配工作。手动核对图片与文字描述是否一致,不仅耗时还容易出…...
【技术解析】LENFusion:如何通过循环反馈与双注意力机制,实现夜间图像融合与低光增强的协同优化?
1. 夜间图像处理的痛点与现有方案局限 当我们需要在夜间或低光照环境下获取清晰的图像时,通常会遇到两个关键问题:一是可见光图像太暗导致细节丢失,二是红外图像虽然能穿透黑暗但缺乏色彩和纹理信息。传统解决方案往往采用"先增强后融合…...
移动气象站 屏幕款便携式自动气象站
屏幕款便携式自动气象站,作为可移动观测型气象站,以“超声波测风高精度传感器一体化集成”为核心技术,突破传统气象站布设繁琐、便携性差、数据精度不足的痛点,凭借轻快便携的支架设计、免调试快速布置、多传输方式适配等优势&…...
高压输电线路智能监测系统设计与实现
1. 项目背景与需求分析高压输电线路作为电力系统的"大动脉",其稳定运行直接关系到整个电网的安全。我在电力行业工作多年,亲眼见过多次因间隔棒故障导致的线路跳闸事故。传统的人工巡检方式存在明显短板:巡检周期长(通常…...
简易数据采集与分析系统
我用 Trae(SOLO Coder) 自主开发了这款专为硬件工程师打造的数据分析工具,无需懂代码,点点鼠标即可完成采集卡数据全流程分析。核心功能一键导入采集卡原始 ADC 数据,自动适配 12/16 位分辨率,精准转换为真…...
中文Python游戏开发避坑指南:植物大战僵尸开发中的5个常见问题及解决方案
Python游戏开发实战:植物大战僵尸复刻中的5个关键技术挑战 在游戏开发领域,Python凭借其简洁语法和丰富的库支持,成为许多独立开发者的首选语言。植物大战僵尸作为一款经典的塔防游戏,其核心玩法看似简单,但在实际开发…...
别再暴力搜索了!用动态规划优化旅行商问题,C++代码效率提升实战
暴力搜索 vs 动态规划:旅行商问题的C效率革命 当城市数量超过10个时,传统的暴力搜索方法在解决旅行商问题(TSP)时就像试图用算盘计算宇宙中的原子数量——理论上可行,实际上完全不切实际。作为一名长期在算法竞赛中摸爬滚打的选手,…...
