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内添加以下命令:

cmake 复制代码
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文件内做出以下改变:

cmake 复制代码
# ../bit7z/cmake/Dependencies.cmake
# 可直接注释全文
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" )
cmake 复制代码
# ../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,可以当一个离线独立模块进行使用,引入构建成功后就到正式的代码编写。

代码示例:

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

压缩

c 复制代码
#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()...*/ 
}

解压

c 复制代码
#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

相关推荐
Theodore_10221 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
‘’林花谢了春红‘’3 小时前
C++ list (链表)容器
c++·链表·list
----云烟----3 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024063 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic4 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it4 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康4 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神4 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
机器视觉知识推荐、就业指导5 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
宅小海5 小时前
scala String
大数据·开发语言·scala