C++项目引入开源库bit7z

news2024/9/22 9:49:18

摘要:

   公司C++项目需要能解压缩.tar文件,关键是要在Windows环境下,tar格式主要是Linux中用的压缩文件,还要考虑到用户可能没有Windows自带的tar命令,最终解决方案就是一步到位,考虑到后续的功能拓展引入第三方工具7z,用bit7z开源库简化调用,也算一个如何部署GitHub上的项目的一个博文。开发组件为VSCode-cmake-GCC,本文会有一些cmake指令,有一点点cmake知识的能更好了解。

(开发环境:VScode,cmake3.8,GCC13.2.0,Windows)

关键词引用第三方库C++bit7z7zcmake

声明:本文作者原创,转载请附上文章出处与本文链接。

文章目录

      • 摘要:
      • 正文:
        • 库引入:
        • 源代码编译:
        • 代码示例:
      • 推荐阅读

正文:

   项目引入的是bit7z-4.0.7版本,应该是截至发布此文时的船新版本,4.0版本与过往3版本的区别挺大,构建更复杂也更自动化,解压缩代码也进行了优化。

   本文会介绍两种引入方法一种库引入以及源代码编译,项目用到的源代码编译,以及源代码方式会更繁琐,所以会侧重讲解源代码的编译方式。也可以看bit7z的Wiki,里面也有更简练的构建编译项目步骤,我初始也是看着Wiki进行引入。

库引入:

   库引用需要准备两个资源,一是下载对应的编译器的bit7z库(下载地址),例如我项目用的编译器为gcc,则下载:

在这里插入图片描述

   以及7z.dll(下载地址)的24.07版本:

在这里插入图片描述

   下载解压缩后可得到include/bit7z/lib/libbit7z64.a7z.dll正常链接即可编译试用,cmake就用target_include_directoriestarget_link_libraries指令链接头文件和库,然后把7z.dll放置到gcc编辑器bing目录下,或者打包放置到.exe目录下。

源代码编译:

   源代码编译一样需要准备两个资源,一个是bit7z的项目源码(下载地址)

在这里插入图片描述

   一个也是7z.dll(下载地址)的24.07版本。不过源代码编译还需要在构建时能连接至少一次GitHub,后续会讲解,一次后即可规避掉,或者先下载两个对应的source。

   资源都准备好了以后,我们就可以正式开始搭建引入,首先把bit7z的源码解压到需要引入项目的 (Project)/3rd/bit7z下(任意目录即可),在主CMakeLists.txt内添加以下命令:

set( ROOT_DIR ${CMAKE_SOURCE_DIR} )
add_subdirectory( ${ROOT_DIR}/3rd/bit7z bit7z.out )
target_link_libraries( ${PROJECT_NAME} PRIVATE bit7z )
# ps:target_link_libraries放于add_executable后

   链接成功,现在就可以尝试第一次cmake configure,如果没有改动其它地方会输出下方的提示,

在这里插入图片描述

   如果在这一步卡住配置不通过的话检查网络连接,确保能连接到GitHub,然后在多尝试几次,这是由于../bit7z/cmake/Dependencies.cmake配置文件内设置拷贝GitHub上的7-zip source以及ghc::filesystem source后链接,成功后会有

在这里插入图片描述

   没有离线需求或者对每次重新configure要连接GitHub不在乎的话可以直接跳到代码示例,成功configure后就可以正常使用build了,把7z.dll拷贝到路径上就可解压缩文件。

   如果感觉需要一步到位,直接规避掉,那就先把第一次configure拷贝的../bit7z/_deps/7-zip-src以及../build/_deps/ghc_filesystem-src统一放置于../bit7z/_deps目录下,然后在cmake文件内做出以下改变:

# ../bit7z/cmake/Dependencies.cmake
# 可直接注释全文
# ../bit7z/cmake/BuildOptions.cmake
# 找到这句指令
set( BIT7Z_CUSTOM_7ZIP_PATH "" CACHE STRING "A custom path to the 7-zip source code" )
# BIT7Z_CUSTOM_7ZIP_PATH 设置7-zip source路径,变为
set( BIT7Z_CUSTOM_7ZIP_PATH "${CMAKE_CURRENT_SOURCE_DIR}/_deps/7-zip-src" CACHE STRING "A custom path to the 7-zip source code" )
# ../bit7z/CMakeLists.txt
# 找到这部分语块
if( ghc_filesystem_ADDED )
    target_link_libraries( ${LIB_TARGET} PRIVATE ghc_filesystem )
endif()
# 添加ghc::filesystem source,变为,if记得加ON 
if( ghc_filesystem_ADDED OR ON )
	target_link_libraries( ${LIB_TARGET} PRIVATE ghc_filesystem )
    set(ghc_filesystem_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/_deps/ghc_filesystem-src")
    message( STATUS "ghc::filesystem source code available at ${ghc_filesystem_SOURCE_DIR}" )
    add_library( ghc_filesystem INTERFACE IMPORTED )
    target_include_directories( ghc_filesystem SYSTEM INTERFACE ${ghc_filesystem_SOURCE_DIR}/include )
endif()

   都更改完后重新configure就不需要GitHub,可以当一个离线独立模块进行使用,引入构建成功后就到正式的代码编写。

代码示例:

   用的官方示例,需求不高简单用用即可,有复杂业务的就创建处理类,针对性设计。

压缩

#include <bit7z/bitarchivewriter.hpp>

try { // bit7z classes can throw BitException objects
    using namespace bit7z;

    Bit7zLibrary lib{ "7z.dll" };
    BitArchiveWriter archive{ lib, BitFormat::SevenZip };

    // Adding the items to be compressed (no compression is performed here)
    archive.addFile( "path/to/file.txt" );
    archive.addDirectory( "path/to/dir/" );

    // Compressing the added items to the output archive
    archive.compressTo( "output.7z" );
} 
catch ( const bit7z::BitException& ex ) {
    /* Do something with ex.what()...*/ 
}

解压

#include <bit7z/bitarchivereader.hpp>

try { // bit7z classes can throw BitException objects
    using namespace bit7z;

    Bit7zLibrary lib{ "7z.dll" };

    // Opening the archive
    BitArchiveReader archive{ lib, "path/to/archive.gz", BitFormat::GZip };

    // Testing the archive
    archive.test();

    // Extracting the archive
    archive.extractTo( "out/dir/" );
} 
catch ( const bit7z::BitException& ex ) {
    /* Do something with ex.what()...*/ 
}

如果正式运行时终端显示这个指令Failed to load the 7-zip library:,则说明你缺少了7z.dll或者位置放置错误。

推荐阅读

博客主页:https://blog.csdn.net/weixin_45068267

项目相关专栏:https://blog.csdn.net/weixin_45068267/category_12716433.html

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

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

相关文章

尚品汇-延迟插件实现订单超时取消(四十五)

目录&#xff1a; &#xff08;1&#xff09;延迟插件封装 &#xff08;2&#xff09;基于延迟插件测试 如何保证消息幂等性&#xff1f; &#xff08;3&#xff09;改造订单service-order模块-实现订单超时取消 &#xff08;1&#xff09;延迟插件封装 把消息带过去&#…

computed计算属性及方法对比和循环遍历统计以及watch和watchEect监听的用法

1.computed计算属性及方法对比 1.了解computed计算属性和用法 在我们的一些应用中可以看的应用会给我们提供一些计算类的功能比如取名&#xff0c;它会给你提供两个输入框&#xff0c;然后在你给这两个输入框输入值的时候会在下方生成你输入这个两个值的结合值&#xff0c;就…

Java使用类加载器解决类冲突,多版本jar共存

Java使用类加载器解决类冲突 1、案例说明2、打包新版本POI并将要调用的方法封装2.1、POM文件2.2、封装的方法 3、要使用多个POI版本的项目3.1、打包前面的项目生成一个jar包3.1、POM文件3.2、类加载器代码3.3、Jar加载工具3.4、最终调用 1、案例说明 项目中已经有了一个旧版本…

【后端开发】PHP、go语言、Java、C++、Linux开发等急招中......

本周高薪急招后端开发岗位推荐&#xff0c;PHP、go语言、Java、C、Linux开发等岗位都在热招&#xff0c;月薪最高35K&#xff0c;还不快来&#xff01;&#xff01; 抓紧投递&#xff0c;早投早入职&#xff01; &#x1f447;点击职位名称查看详情&#x1f447; PHP 薪资&…

Leetcode每日刷题之102.二叉树的层序遍历

1.题目解析 本题是关于二叉树的层序遍历&#xff0c;不过这里的难点是如何将每一层的数据存储在数组并将整体存储在一个二维数组中&#xff0c;具体的算法原理我们在下面给出 2.算法原理 关于将每层数据分别存储在不同数组中&#xff0c;我们可以定义一个levelSize变量来存储栈…

网络编程(TCP+网络模型)

【1】TCP 初版服务器 #include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <unistd.h> #include <arpa/inet.h> #include <string.h…

【学习笔记】SSL/TLS如何运用加密工具

一、前文回顾&#xff1a; 1、SSL/TLS有3个目的&#xff0c;分别由不同密码学工具提供 Confidentiality&#xff08;保密性&#xff09;&#xff1a;数据只有Client和Server才能访问&#xff0c;由Encryption&#xff08;加密&#xff09;所提供Integrity&#xff08;完整性&…

【话题讨论】VS Code:倍增编程动力,实现效率飞跃

目录 引言 一、详情介绍 功能特点 使用场景 提高工作效率 二、效率对比 2.1 高度可定制性与丰富的插件生态 2.2 智能的代码补全与导航 2.3 内置的调试器与版本控制集成 2.4 轻量级与跨平台 2.5 选择合适工具的重要性 2.6 实际案例或数据展示 三、未来趋势 3.1 编…

iOS——Block与内存管理

需要内存管理的情况 1、对象类型的auto变量。 2、引用了 __block 修饰符的变量。 三种block类型 全局类型 &#xff08;NSGlobalBlock&#xff09; 如果一个block里面没有访问普通局部变量(也就是说block里面没有访问任何外部变量或者访问的是静态局部变量或者访问的是全局…

FPGA开发:可编程逻辑器件概述

PLD 1、什么是PLD&#xff1f; PLD指Programmable Logic Device&#xff0c;翻译为"可编程逻辑器件"。是20世纪70年代发展起来的一种新的集成电路&#xff0c;是一种半定制的集成电路。 PLD具有逻辑功能实现灵活。集成度高、处理速度快的特点。 PLD就像是一个可定…

【Vue】pnpm创建Vue3+Vite项目

初始化项目 &#xff08;1&#xff09;cmd切换到指定工作目录&#xff0c;运行pnpm create vue命令&#xff0c;输入项目名称后按需安装组件 &#xff08;2&#xff09;使用vs code打开所创建的项目目录&#xff0c;Ctrl~快捷键打开终端&#xff0c;输入pnpm install下载项目…

IDEA运行Java程序提示“java: 警告: 源发行版 11 需要目标发行版 11”

遇到这个提示一般是在pom.xml中已经指定了构建的Java版本环境是11例如(此时添加了build插件的情况下虽然不能直接运行代码但是maven是可以正常打包构建)&#xff1a; <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><…

Vue初学-简易计算器

最近在学习Vue的指令&#xff0c;做了一个简易计算器&#xff0c;比较适合刚入门的人参考学习。用到的知识点有&#xff1a; 1.插值表达式 2.v-model&#xff0c;双向绑定、-、*、/、**等操作符 3.v-show&#xff0c;控制操作数2是否显示&#xff0c;乘方时不显示操作数2 4.met…

‌软媒市场—‌软媒市场自助发布平台引领数字营销新风尚

在当今这个信息爆炸的时代,数字营销已经成为企业推广品牌、提升知名度的关键手段。而在众多数字营销工具中,‌软媒市场自助发布平台以其独特的优势脱颖而出,成为众多企业的首选。今天,我们就来深入探讨一下软文媒体自助发布平台如何在软媒市场中发挥重要作用,以及其背后的5万家…

FRP代理(TCP通信)实验

攻击机器---公网机器&#xff08;FRP服务端&#xff09;-TCP传输rdp内容--内网机器&#xff08;FRP客户端&#xff09;--内网本地&#xff08;RDP服务&#xff09; FRP版本&#xff1a;0.49.0 公网IP&#xff08;FRP服务端&#xff09;&#xff1a;192.168.254.131 内网&…

Mindspore 初学教程 - 4. 数据集 Dataset

数据是深度学习的基础&#xff0c;MindSpore 提供基于 Pipeline 的 数据引擎&#xff0c;通过数据集 数据集&#xff08;Dataset&#xff09; 和 数据变换&#xff08;Transforms&#xff09; 实现高效的数据预处理。其中 Dataset 是 Pipeline 的起始&#xff0c;用于加载原始数…

# centos7 安装 mysql

centos7安装mysql 1、添加 mysql 官方 yum 存储库 wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpmrpm -ivh mysql80-community-release-el7-3.noarch.rpm2、使用Yum安装MySQL服务器&#xff1a; sudo yum install mysql-server3、启动MySQL服务…

Redis集群技术2——redis基础

Redis安装 Redis 的安装相对简单&#xff0c;无论是 Windows、Linux 还是 macOS 系统&#xff0c;都有相应的安装方法。以下是针对不同操作系统的 Redis 安装简述。 1. Linux 系统安装 Redis 在 Linux 系统中安装 Redis 通常有多种方式&#xff0c;这里以 Ubuntu 和 CentOS 为…

配置阿里云千问大模型--环境变量dashscope

1 开通百炼 首先要进入到阿里云平台&#xff0c;然后进入百炼平台。 2 获取API-KEY 进入之后再右上角可以查看到自己的API-KEY&#xff0c;这个东西就是需要配置在环境变量里的。 点击查看就可以获取 3 配置DASHSCOPE环境变量 如果使用dashscope来进行千问大模型的API对…

速度滞后补偿控制

这里介绍的速度滞后补偿控制和我们前面介绍的前馈控制有所区别&#xff0c;前馈控制的前提是能够获取位置参考指令的速度或加速度信号。在无法获取位置参考指令的上述性息的前提下&#xff0c;我们可以采用速度滞后补偿控制提高机电伺服控制系统动态跟踪精度。前馈控制的一些基…