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

相关推荐
A懿轩A20 分钟前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
机器视觉知识推荐、就业指导25 分钟前
C++设计模式:享元模式 (附文字处理系统中的字符对象案例)
c++
半盏茶香25 分钟前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
Evand J1 小时前
LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度
开发语言·matlab
LucianaiB1 小时前
探索CSDN博客数据:使用Python爬虫技术
开发语言·爬虫·python
Ronin3051 小时前
11.vector的介绍及模拟实现
开发语言·c++
✿ ༺ ོIT技术༻1 小时前
C++11:新特性&右值引用&移动语义
linux·数据结构·c++
字节高级特工1 小时前
【C++】深入剖析默认成员函数3:拷贝构造函数
c语言·c++
计算机学长大白2 小时前
C中设计不允许继承的类的实现方法是什么?
c语言·开发语言
PieroPc3 小时前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel