CMake构建学习笔记2-zlib库的构建

news2024/11/15 8:31:11

文章目录

  • 1. 概述
  • 2. 详论
    • 2.1 设置构建目录
    • 2.2 配置构建
    • 2.3 构建项目
    • 2.4 安装项目
    • 2.5 清理构建目录
  • 3. 总结

1. 概述

Zlib是一个数据压缩库,它提供了在内存中对数据进行压缩和解压缩的功能。这个库非常泛用,除了直接使用这个库之外,很多依赖库都会间接依赖它。这里就以Windows系统为例介绍一下如何通过CMake构建它。

2. 详论

2.1 设置构建目录

尽管CMake提供了GUI工具,但是不推荐通过GUI进行构建。原因很简单,有很多构建选项需要我们自己控制,一个个去配置是很容易忘记自己配置了哪些选项的,总不能把配置的截图保存下来吧?因此还是使用脚本比较合适。

在下载源代码之后,进入源代码目录,会有一个CMakeLists.txt文件,这个文件就是用于CMake构建的项目文件。在进行构建之前,需要设置一个单独的目录存放构建的中间文件和结果文件,方便与源代码分开。通常的做法是在这个跟目录中创建一个名为Build的目录。

2.2 配置构建

接下来,使用如下命令来配置构建项目:

# 配置CMake  
cmake .. -G "$Generator" -A x64 -DCMAKE_CONFIGURATION_TYPES=RelWithDebInfo -DCMAKE_INSTALL_PREFIX="$InstallDir" -DZLIB_BUILD_EXAMPLES=OFF
  1. ..表示项目的根目录是上一级目录。
  2. -G $Generator的意思设置生成器,在Windows环境下一般使用MSVC进行构建,例如使用Visual Studio 2019进行构建,Generator就应该是"Visual Studio 16 2019"。
  3. -A x64指定架构为64位。
  4. 所有的构建配置项目以-D开头,CMAKE_CONFIGURATION_TYPES是一个CMake内置变量,用于控制可用的配置类型,这里使用的是RelWithDebInfo,也就是Release带调试信息的类型。
  5. CMAKE_INSTALL_PREFIX也是一个内置的CMake变量,用于设置项目安装的目录,如果不设置的话,Linux系统下默认会安装到"/usr/local",Windows系统下会安装到"C:/Program Files/"。
  6. ZLIB_BUILD_EXAMPLES内置一个项目提供的一个配置项,表示不用构建项目自带的案例程序。

越是大型项目,需要配置的构建项就越多。对于项目提供的配置项,可以在CMakeLists.txt中看到,例如:

option(ZLIB_BUILD_EXAMPLES "Enable Zlib Examples" ON)

如果不会看这些也不要紧,可以打开CMake的GUI工具帮助我们辅助查看。在GUI工具中会列出所有的CMake变量和项目配置项:

CMake变量和项目配置

2.3 构建项目

然后就是正式开始构建项目了:

# 构建阶段,指定构建类型
cmake --build . --config RelWithDebInfo
  1. --build表示构建项目。
  2. .表示构建的结果放在当前目录。
  3. --config RelWithDebInfo表示按照Release带调试信息的类型进行构建。

2.4 安装项目

最后是安装项目。有的读者包括笔者最开始会比较奇怪,dll也需要安装的吗?是的没错,需要安装,而且最好把所有依赖库安装到一个目录中,这样便于引用和管理。

# 安装阶段,指定构建类型和安装目标
cmake --build . --config RelWithDebInfo --target install

2.5 清理构建目录

另外还有个指令是清理构建生成的文件,不过使用的不是很多,手动删除也行:

# 清理构建目录
cmake --build . --target clean

3. 总结

以上大概就是构建一个C/C++依赖库项目的过程了,不止是zlib,其他库也可以按照这种方式进行构建,最大的区别就是不同的项目可能需要的配置项不同,读者需要灵活掌握。

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

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

相关文章

学历不高能进大厂么?

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

《终身学习——10个你必须掌握的未来生存法则》读书笔记

无论你遵守与否,大自然的法则是无法改变的,你若无视“重力法则”,从屋顶跳下,那给你善后的就不是“重力警察”了。同理,如果你不遵循成长法则,也不会有“成长警察”找你麻烦,你只会发现自己的成…

结合 curl 与住宅代理实现高效数据抓取

引言 什么是 curl?有哪些功能? 基本 curl 命令有哪些? 为什么要使用 curl 处理 HTTP 请求? 如何使用 curl 和住宅代理进行网络抓取? 总结 引言 在当今数据驱动的商业环境中,数据的获取和分析能力是企…

HttpMessageNotReadableException

项目本身用的全是JSON,但是对接MES的时候他们用的XML,就添加了对XML的支持,然后发现AGV发送任务的接口报下面的错误了。 Error while extracting response for type [class java.lang.String] and content type [application/json;charsetut…

77 智能卡ATR TA1通信速率计算

1 前言 智能卡读卡器在读卡前期会以默认标准通信速率9600与卡片交互,期间可通过卡片返回的ATR值中TA1字段获取卡片支持的最大通信速率,然后读卡器通过PPS指令与卡片协商更改通信速率,最后以协商的速率进行通信。 起初默认9600波特率是比较慢的…

图片高清修复怎么做?4种高清修复方法分享给你

照片已经成为我们记录生活、珍藏回忆的重要方式。然而,随着时间的推移,不少珍贵的照片可能因保存不当或拍摄技术限制而变得模糊不堪。想要将这些模糊的照片变清晰成为当下的急迫需求。不过不用担心,下面就来给大家分享4种高清修复图片方法&am…

TCP系列相关内容

一、TCP上传文件 loop——本地回环测试地址。 void *memset(void *s,int c,size_t n)——给一个变量设定一个值。 1、“粘包”问题 两次分别发送的数据,被一起接收形成该现象。 原因:TCP流式套接字,数据与数据间没…

超低排放验收流程的全方位指南

近年来,随着环保要求的不断升级,朗观视觉超低排放验收成为了众多工业企业必须面对的关键环节。本文将详细介绍超低排放验收流程的安装要求、最新政策、国家标准以及企业应对的解决方案,帮助企业更好地理解和应对这一重要课题。 一、超低排放验…

校园一卡通_q7e7o

TOC springboot576校园一卡通_q7e7o--论文 第一章 概述 1.1 研究背景 近些年,随着中国经济发展,人民的生活质量逐渐提高,对网络的依赖性越来越高,通过网络处理的事务越来越多。随着校园一卡通的常态化,如果依然采用…

JS中Promise用法(简要说明)

文章目录 1、下方自定义名词约定2、官方流程图3、构造函数Promise <状态>fulfilled 用法代码图示 4、构造函数Promise <状态>rejected 用法代码图示 5、第3和4结合使用&#xff0c;可以将promise状态settled为2种情况之一代码图示&#xff08;图中if和else都是调…

移动硬盘直接拔下来有什么影响吗?数据丢失如何恢复

在日常的工作与生活中&#xff0c;移动硬盘成为了我们不可或缺的数据存储和传输设备。然而&#xff0c;很多人或许都曾有过这样的经历&#xff1a;在数据传输或使用中&#xff0c;由于一时疏忽或赶时间&#xff0c;直接拔下了正在工作的移动硬盘。这样的行为&#xff0c;虽然看…

冷却液温度传感器检测诊断

检测发动机冷却液温度&#xff0c;向ECU输入温度信号&#xff0c;作为燃油喷射和点火正时的修正信号&#xff0c;同时也是其他控制系统的控制信号。 冷却液温度传感器安装位置 冷却液温度传感器&#xff08;俗称水温传感器&#xff09;一般安装在缸体水道上&#xff0c;缸盖水…

docker命令实现容器管理

容器镜像分类 1.系统类镜像 2.应⽤镜像 搜索镜像 下载镜像 默认下载最新版本 1.安装docker环境 #配置变量 2.启动并且使⽤ 2.配置远程管理 帮助和指令

JVM的五个 invoke 指令详解

文章目录 概述invoke 指令概览1. invokespecial2. invokevirtual3. invokestatic4. invokeinterface5. invokedynamic 总结 概述 Java 虚拟机 (JVM) 是 Java 语言的核心组件之一&#xff0c;负责执行 Java 字节码。在 JVM 中&#xff0c;invoke 指令用于执行方法调用。本文将详…

K8s 集群巡检

K8s 集群巡检 上次发文 K8s 无备份&#xff0c;不运维&#xff0c;文章开篇&#xff0c;插入了一张 K8s 集群巡检的图片&#xff0c;好多小伙伴私信留言&#xff0c;问我要开源地址。由于其通用性不高&#xff0c;大多数公司需要结合自身的架构情况进行不同的巡检&#xff0c;…

互联网应用主流框架整合之Redis配置

在实际的商用系统中&#xff0c;Redis常用的机制包括备份、回收策略、主从复制、哨兵模式、集群模式等&#xff0c;在保证性能的同时还要保证其高可用 首先要熟悉一下Redis的配置文件&#xff0c;如果实在linux系统中&#xff0c;配置文件是redis.conf&#xff0c;而在windows…

linux系统编程:网络通信

1.网络 1.粘包 tcp特点 面向连接 字节流&#xff08;TCP 将数据视为连续的字节流&#xff0c;没有明确的消息边界。会发生粘包问题。 避免粘包 特殊分隔符&#xff1a;在消息间加入特殊的分隔符&#xff08;如换行符或其他特殊字符&#xff09;&#xff0c;接收方根据分…

404炫酷单页面html5源码

源码介绍 404炫酷单页面html5源码&#xff0c;感觉应该符合一些人的感觉&#xff01;可以用来做404页面。记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 源码下载 分…

Java基础再学习

作为一名实习生&#xff0c;为了夯实基础、查缺补漏&#xff0c;我跟随 B 站学习了以下知识&#xff0c;欲将其留存纪念&#xff0c;故对其中内容进行优化&#xff0c;以使其更为优雅。 面向对象 面向对象编程的定义&#xff1a;借助合适的对象来解决问题&#xff08;如运用 …

可视化表单设计生成器可以实现流程化办公吗?

实现流程化办公一直都是很多客户朋友追求的目标。那么&#xff0c;如何才能实现这一目标&#xff1f;如何为客户提供更优良的产品助力提质、降本、增效&#xff1f;低代码技术平台拥有可视化操作界面、更灵活、更高效、更可靠&#xff0c;是专注于职场办公&#xff0c;助力流程…