当前位置: 首页 > article >正文

C++项目引入开源库bit7z

摘要:

   公司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.kler.cn/a/292602.html

相关文章:

  • MySQL(5)【数据类型 —— 字符串类型】
  • Dolby TrueHD和Dolby Digital Plus (E-AC-3)编码介绍
  • 软件测试面试大全(含答案+文档)
  • Gartner发布安全平台创新洞察:安全平台需具备的11项常见服务
  • Llama架构及代码详解
  • UniApp 应用、页面与组件的生命周期详解
  • ARM SIMD instruction -- movi
  • ccfcsp-202209(1、2、3)
  • Kafka【十一】数据一致性与高水位(HW :High Watermark)机制
  • 企业财务流程优化的财税自动化解决方案
  • Python知识点:如何使用Pytest进行单元测试
  • JVM系列(十) -垃圾收集器介绍
  • OpenObserve云原生可观测平台本地Docker部署与远程访问实战教程
  • KDD2024参会笔记-Day1
  • Core ML
  • 基于.NET6的WPF基础总结(上)
  • CSS学习9
  • RPC框架-RMI
  • OpenHarmony应用开发( Beta5版)利用native方式实现跨线程调用最佳实践
  • nvidia-cuda-tensorrt-cudnn下载网站
  • 【golang】使用container/heap官方包实现一个优先队列
  • 鼠标在虚拟机virtualbox里面不显示/消失,如何解决?
  • Stable Diffusion训练LoRA模型参数详细说明(阿里巴巴堆友AI)
  • List、Set、Map中的方法使用、Stream流、Collections工具类
  • 如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
  • 一个开源、注重隐私且支持自托管的网站分析工具