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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv基础55-获取轮廓的特征值及示例

轮廓自身的一些属性特征及轮廓所包围对象的特征对于描述图像具有重要意义。本节介绍几个轮廓自身的属性特征及轮廓所包围对象的特征。 宽高比 可以使用宽高比&#xff08;AspectRation&#xff09;来描述轮廓&#xff0c;例如矩形轮廓的宽高比为&#xff1a; 宽高比 宽度&am…

httpd+Tomcat(jk)的Web动静分离搭建

动静分离是指将动态请求和静态请求分别交给不同的服务器来处理&#xff0c;可以提高服务器的效率和性能。在Java Web开发中&#xff0c;常见的动态请求处理方式是通过Tomcat来处理&#xff0c;而静态请求则可以通过Apache服务器来处理。本文将详细讲解如何结合Apache和Tomcat来…

Mysql SUBSTRING_INDEX - 按分隔符截取字符串

作用&#xff1a; 按分隔符截取字符串 语法&#xff1a; SUBSTRING_INDEX(str, delimiter, count) 属性&#xff1a; 参数说明str必需的。一个字符串。delimiter必需的。分隔符定义&#xff0c;是大小写敏感&#xff0c;且是多字节安全的count必须的。大于0或者小于0的数值…

什么是Selenium?使用Selenium进行自动化测试

什么是 Selenium&#xff1f;   Selenium 是一种开源工具&#xff0c;用于在 Web 浏览器上执行自动化测试&#xff08;使用任何 Web 浏览器进行 Web 应用程序测试&#xff09;。   等等&#xff0c;先别激动&#xff0c;让我再次重申一下&#xff0c;Selenium 仅可以测试We…

灰度均衡变换之c++实现(qt + 不调包)

1.基本原理 灰度均衡是以累计分布函数变换为基础的直方图修正法&#xff0c;它可以产生一副灰度级分布概率均匀的图像。也就是说&#xff0c;经过灰度均衡后的图像在没一级灰度上像素点的数量相差不大。公式见下图&#xff0c;为灰度值为x的像素点的个数&#xff0c;n为总像素点…

修改el-select和el-input样式;修改element-plus的下拉框el-select样式

修改el-select样式 .select_box{// 默认placeholder:deep .el-input__inner::placeholder {font-size: 14px;font-weight: 500;color: #3E534F;}// 默认框状态样式更改:deep .el-input__wrapper {height: 42px;background-color: rgba(0,0,0,0)!important;box-shadow: 0 0 0 …

详解配置交换机多生成树MSTP+VRRP 的典型组网

详解配置交换机多生成树MSTPVRRP 的典型组网 组网&#xff1a; 1. 这是一个由三台交换机组成的倒三角型二层交换网络&#xff1b;网络中有4个VLAN&#xff1a;10、20、30、40&#xff1b;接口编号如图所示&#xff1b;SW3为接入层交换机&#xff0c;SW1、SW2为汇聚层交换机&am…

竞赛项目 深度学习的智能中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…

创建CREATE_STAT_TABLE 统计信息表在达梦和oracle中的使用

达梦 创建CREATE_STAT_TABLE 统计信息表 PROCEDURE CREATE_STAT_TABLE ( STATOWN VARCHAR(128), STATTAB VARCHAR(128), TABLESPACE VARCHAR(128) DEFAULT NULL, GLOBAL_TEMPORARY BOOLEAN DEFAULT FALSE ); 创建普通表的对应系统表的列名字段包括以下&#xff1a; OWNER TABL…

Prometheus技术文档--基本安装-docker安装并挂载数据卷-《十分钟搭建》

一、查看可安装的版本 docker search prom/prometheus 二、拉取镜像 docker pull prom/prometheus 三、查看镜像 docker images 四、书写配置文件-以及创建挂载目录 宿主机挂载目录位置&#xff1a; 以及准备对应的挂载目录&#xff1a; /usr/local/docker/promethues/se…

vue 项目中 utils 中 js 文件早于 main.js 文件调用

vue项目中utils中js文件早于main.js文件调用

在Qt中使用LoadLibrary无法加载DLL

Qt系列文章目录 文章目录 Qt系列文章目录前言一、问题分析 前言 最近因项目需要使用qt做开发&#xff0c;之前使用LoadLibrary加载dll成功&#xff0c;很庆幸&#xff0c;当一切都那么顺风顺水的时候&#xff0c;测试同事却发现&#xff0c;在windows平台上个别电脑上加载dll会…