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++,bit7z,7z,cmake
声明:
本文作者原创,转载请附上文章出处与本文链接。
文章目录
- 摘要:
- 正文:
- 库引入:
- 源代码编译:
- 代码示例:
- 推荐阅读
正文:
项目引入的是bit7z-4.0.7
版本,应该是截至发布此文时的船新版本,4.0版本与过往3版本的区别挺大,构建更复杂也更自动化,解压缩代码也进行了优化。
本文会介绍两种引入方法一种库引入以及源代码编译,项目用到的源代码编译,以及源代码方式会更繁琐,所以会侧重讲解源代码的编译方式。也可以看bit7z的Wiki,里面也有更简练的构建编译项目步骤,我初始也是看着Wiki进行引入。
库引入:
库引用需要准备两个资源,一是下载对应的编译器的bit7z库(下载地址),例如我项目用的编译器为gcc,则下载:
以及7z.dll(下载地址)的24.07版本:
下载解压缩后可得到include/bit7z/
、lib/libbit7z64.a
、7z.dll
正常链接即可编译试用,cmake就用target_include_directories
、target_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