cmake (更新中)

news2025/2/27 16:32:11

概述

      关于 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

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

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

相关文章

VLOOKUP函数使用

在Excel中&#xff0c;VLOOKUP函数用于在一个范围内查找某个值&#xff0c;并返回该值所在行的指定列的内容。VLOOKUP函数的基本语法如下&#xff1a; VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])参数说明&#xff1a; lookup_value&#xff1a;要查…

MySQL_事务学习笔记

事务 注意&#xff1a;一定要使用 Innodb 存储引擎 概述&#xff1a;一组操作的集合&#xff0c;是不可分割的工作单元&#xff0c;会把一个部分当成一个整体来处理&#xff0c;事务会把操作同时提交或者是撤销。要么同时成功&#xff0c;要么同时失败。 比如&#xff1a;上云…

汽车制造业上下游协作时 外发数据如何防泄露?

数据文件是制造业企业的核心竞争力&#xff0c;一旦发生数据外泄&#xff0c;就会给企业造成经济损失&#xff0c;严重的&#xff0c;可能会带来知识产权剽窃损害、名誉伤害等。汽车制造业&#xff0c;会涉及到重要的汽车设计图纸&#xff0c;像小米发送汽车设计图纸外泄事件并…

离线安装vscode插件,导出 Visual Studio Code 的扩展应用,并离线安装

在没有网络的情况下&#xff0c;如何安装vscode插件 1.使用之前电脑安装过的插件包 Visual Studio Code 的扩展应用安装位置在文件夹 .vscode/extensions 下。不同平台&#xff0c;它位于&#xff1a; Windows %USERPROFILE%\.vscode\extensions Mac ~/.vscode/extensions L…

AIRIOT出席IOTE生态行·北京物联网应用交流大会

8月8日&#xff0c;由物联传媒、IOTE物联展、AIoT库、AIoT星图研究院联合主办的IOTE生态行北京物联网应用交流大会圆满结束&#xff0c;超300位业界同行同台交流。 航天科技控股集团股份有限公司受邀参会&#xff0c;旗下AIRIOT物联网平台产品负责人段丽娜发表演讲&#xff0c;…

双向循环链表、dancing links

目录 双向循环链表 力扣 426. 将二叉搜索树转化为排序的双向链表 十字交叉双向循环链表&#xff08;dancing links&#xff09; 精确覆盖问题 dancing links X算法&#xff08;V1递归版&#xff09; POJ 3740 Easy Finding 数独 X算法优化 X算法&#xff08;V2非递归…

使用Python爬取某查查APP端(Appium自动化篇)

1. 写在前面 某查查网站反爬虫风控还是较强的&#xff0c;之后会分别介绍一下PC端协议、APP端自动化、APP端接口协议三种采集方案。这里主要介绍APP端的自动化方式&#xff0c;APP端自动化方式需要登陆账号&#xff0c;协议的话需要签名授权&#xff08;自动化经测试没有太多限…

生产事故-走近科学之消失的JWT

0x01 事故背景 2021年11月26日01时10分&#xff0c;P公司正在进行某业务系统的生产环境部署操作&#xff0c;但其实早在00时30分的时候&#xff0c;他们已经完成过一次部署了&#xff0c;但是奇怪的是无论如何都通不过验证&#xff0c;无奈只好推倒重来&#xff0c;如此反复了…

opencv实战项目 实现手势跟踪并返回位置信息(封装调用)

OpenCV 是一个基于 Apache2.0 许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 需要提前准备opencv 和 mediapipe库 pip --default-timeout5000 install -i https://pypi.tuna.tsi…

腾讯云服务器使用教程_手把手图文详细介绍

腾讯云服务器使用教程包括注册账号实名认证、选择云服务器CVM或轻量应用服务器CPU内存带宽和系统盘配置、安全设置和云服务器远程连接、安全组端口开通教程、云服务器环境部署以搭建网站为例手把手网站上线&#xff0c;云服务器文件传输和数据备份以及技术支持等详细说明&#…

【Linux】用户和权限

文章目录 前言什么是 root 用户su 命令和 exit 命令sudo 命令为普通用户配置 sudo 认证 用户、用户组管理什么是Linux 用户和用户组用户组管理用户管理创建用户删除用户查看用户所属组将指定用户添加到指定用户组中 查看当前系统的用户和用户组 权限控制权限信息 修改权限控制修…

MyBatisX自动和数据库的字段关联

先下个插件 右键数据库&#xff0c;点MybatisX-Generator 在根据自己需求勾选 actual column&#xff1a;保证数据库的驼峰命名生效

第10集丨Vue 江湖 —— 表单输入绑定

目录 一、v-model1.1 基本用法1.2 值绑定1.3 修饰符1.3.1 .lazy1.3.2 .number1.3.3 .trim 二、总结2.1 案例2.2 效果 一、v-model 1.1 基本用法 功能&#xff1a; v-model指令在表单 <input>、<textarea> 及 <select> 元素上创建双向数据绑定。它会根据控件…

【人工智能前沿弄潮】——生成式AI系列:扩散模型及稳定扩散模型

VAE、GAN的出现&#xff0c;使得生成式AI越发火热&#xff0c;如今扩散模型的出现与兴起&#xff0c;更是将AIGC推到了人工智能风口&#xff0c;被视作如今人工智能生成艺术领域取得突破的主要因素。相较于VAE和GAN,扩散模型生成的图片质量更好。随着transformer架构的出现和pr…

Uniapp当中使用腾讯位置路线规划插件保姆教学

首先我们在使用腾讯地图插件之前我们需要先做几点准备 1&#xff1a;我们需要在腾讯地图位置服务当中注册账号以及在控制台当中创建应用和创建key 这里在创建应用当中应用类型一定要选出行类型&#xff0c;否则后期可能会出现问题。 我们创建完应用之后&#xff0c;点击创建…

elementUi表单恢复至初始状态并不触发表单验证

elementUi表单恢复至初始状态并不触发表单验证 1.场景再现2.解决方法 1.场景再现 左侧是树形列表&#xff0c;右侧是显示节点的详情&#xff0c;点击按钮应该就是新增一个规则的意思&#xff0c;表单内容是没有改变的&#xff0c;所以就把需要把表单恢复至初始状态并不触发表单…

线性代数(三) 线性方程组向量空间

前言 如何利用行列式&#xff0c;矩阵求解线性方程组。 线性方程组的相关概念 用矩阵方程表示 齐次线性方程组&#xff1a;Ax0&#xff1b;非齐次线性方程组&#xff1a;Axb. 可以理解 齐次线性方程组 是特殊的 非齐次线性方程组 如何判断线性方程组的解 其中R(A)表示矩阵A的…

Hugging News #0414: Attention 在多模态情景中的应用、Unity API 以及 Gradio 主题构建器

社区动向 Attention 在视觉领域的应用 注意力机制改变了许多学科的深度学习研究&#xff0c;从 NLP 开始扩展到视觉、语音等。注意力机制的使用在深度学习研究中变得越来越流行&#xff0c;理解和解释注意力机制的内部工作是至关重要的。 我们发布了一个教程&#xff0c;介绍…

面试官:前面我们聊了主从和哨兵,那今天来聊一聊集群吧

目录 秃顶面试官&#xff1a;简单介绍下什么是Redis Cluster呢? 秃顶面试官&#xff1a;那集群的缺点有哪些呢&#xff1f; 秃顶面试官&#xff1a;说说如何搭建集群呢&#xff1f; 秃顶面试官&#xff1a;集群内部是如何通信的呢&#xff1f; 秃顶面试官&#xff1a;线上…

three.js上传模型文件并加载显示

效果大概这样&#xff0c;这个宝箱模型是直接初始化就显示的&#xff0c;人物模型是自己本地添加上去的&#xff0c;代码如下。 <template><div class"container" ref"container"><el-row><el-col :span"24"><div c…