#include <archive.h>报错

news2024/11/16 22:04:05

#include <archive.h>报错

archive配置

Linux环境下,在C++项目.cpp文件中存在如下语句,导致无法运行~

#include <archive.h>
#include <archive_entry.h>

由于C++编译器默认不包含archive,所以我们需要自行配置。

Libarchive 3.6.2 安装教程

查看了许多教程,了解到在g++编译时需要包含archive的静态链接库或者动态链接库。
接下来就是下载libarchive,进行安装,安装之后会自动生成archive的静态链接库libarchive.a
下载链接如下:
Release Libarchive 3.6.2 · libarchive/libarchive (github.com)
将软件包下载至指定位置解压,之后进入目录libarchive 3.6.2,执行如下命令安装。

./configure
make
sudo make install

如下图所示,没有报错就是安装成功了!由图中的提示信息,我们了解到安装的目录是/usr/local/lib/
在这里插入图片描述
然后,我们进入目录,看到安装成功的静态链接库libarchive.a以及动态链接库libarchive.so.13.6.2
在这里插入图片描述

编译

如下是gcc的命令行参数说明,g++是同样的道理。
gcc简介和命令行参数说明-CSDN博客
C/C++专题—gcc g++ 参数详解 - 知乎 (zhihu.com)
-static 此选项将禁止使用动态库。
-o 制定输出名称,缺省的时候,gcc 编译出来的文件是a.out
-O0
-O1
-O2
-O3
编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高。

我们首先执行了如下的bash命令。

g++ -O3 /home/fanjiarong/文档/Coverset/test_6.cpp /usr/local/lib/libarchive.a -o /home/fanjiarong/文档/Coverset/test_6

可惜报错如下所示:

fanjiarong@fanjiarong-virtual-machine:~/文档/Coverset$ g++ -O3 /home/fanjiarong/文档/Coverset/test_6.cpp /usr/local/lib/libarchive.a -o /home/fanjiarong/文档/Coverset/test_6
/usr/bin/ld: /tmp/ccd5ARH1.o: in function `main':
crc32.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccVV3AU0.o:test_6.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /usr/local/lib/libarchive.a(archive_read_support_filter_gzip.o): in function `gzip_filter_close':
/home/fanjiarong/libarchive-3.6.2/libarchive/archive_read_support_filter_gzip.c:519: undefined reference to `inflateEnd'
/usr/bin/ld: /usr/local/lib/libarchive.a(archive_read_support_filter_gzip.o): in function `consume_header':
/home/fanjiarong/libarchive-3.6.2/libarchive/archive_read_support_filter_gzip.c:350: undefined reference to `crc32'
/usr/bin/ld: /home/fanjiarong/libarchive-3.6.2/libarchive/archive_read_support_filter_gzip.c:356: undefined reference to `inflateInit2_'
/usr/bin/ld: /usr/local/lib/libarchive.a(archive_read_support_filter_gzip.o): in function `gzip_filter_read':
/home/fanjiarong/libarchive-3.6.2/libarchive/archive_read_support_filter_gzip.c:472: undefined reference to `inflate'
/usr/bin/ld: /usr/local/lib/libarchive.a(archive_read_support_filter_gzip.o): in function `consume_trailer':
/home/fanjiarong/libarchive-3.6.2/libarchive/archive_read_support_filter_gzip.c:401: undefined reference to `inflateEnd'
collect2: error: ld returned 1 exit status

之后查阅资料,在如下的博客中找到了解决方案!
undefined reference to inflateInit2_ 解决方案
解决方法是:加上-lz

fanjiarong@fanjiarong-virtual-machine:~/文档/Coverset$ g++ -O3 /home/fanjiarong/文档/Coverset/test_6.cpp /usr/local/lib/libarchive.a -o /home/fanjiarong/文档/Coverset/test_6 -lz

到此为止,成功编译,生成test_6 可执行文件。如果运行直接在对应目录下执行./test_6即可!

archive学习笔记

Linux压缩库 archive 使用
libarchive项目开发了一个可移植、高效的C库,可以读取和写入各种格式的流式归档。
大家可以参照以上博客进行系统学习,本文仅对我学习项目用到的函数进行简单记录,同时可以体现archive具体如何使用:

/* 将 buf 对应的文件解压为archive对象 */
struct archive *open_tgz(void *buf, size_t size)
{
  struct archive *a = archive_read_new();  // 分配和初始化适合从存档中读取的struct归档对象
  archive_read_support_compression_gzip(a);  // 为指定的gzip压缩启用自动检测代码和解压缩支持
  archive_read_support_format_tar(a);
  assert(archive_read_open_memory(a, buf, size) == ARCHIVE_OK);  // ARCHIVE_OK=0 本函数用于打开存档,并准备读取条目 正常情况不会触发assert
  return a;
}

size_t size;
unsigned long long *archive_buf = (unsigned long long *)map_file("一个tgz文件路径/output.tgz", size);
struct archive *a = open_tgz(archive_buf, size);
struct archive_entry *entry;
// archive_read_next_header():读取下一个条目的标题,并返回指向struct archive_entry的指针。
while (archive_read_next_header(a, &entry) == ARCHIVE_OK) {
  cout << archive_entry_pathname(entry) << endl;
}

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

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

相关文章

Java 基础--interview经典(个人认为)题目

1&#xff09;多线程中 synchronized 锁升级的原理是什么&#xff1f; synchronized 锁升级原理&#xff1a;在锁对象的对象头里面有一个 threadid 字段&#xff0c;在第一次访问的时候 threadid 为空&#xff0c;jvm 让其持有偏向锁&#xff0c;并将 threadid 设置为其线程 i…

终の序章(一)

前言 写在我大三的最后一次省赛 &#xff0c;也是最后一次比赛 从半年前区域赛的大失利&#xff0c;导致我曾一度放弃算法竞赛和算法训练 新路历程 考虑到前几次的省赛&#xff0c;我们这次采取 稳 的一种方式&#xff0c;因为前几次省赛难度跨度较 大&#xff0c;对于大部…

【牛客网面试必刷TOP101】链表篇(二)

【牛客网面试必刷TOP101】链表篇&#xff08;二&#xff09; 前言刷题网站刷题&#xff01;BM4 合并两个排序的链表思路一&#xff1a;双指针思路二&#xff1a;递归&#xff08;扩展思路&#xff09; BM5 合并k个已排序的链表思路一&#xff1a;归并排序思想 BM6 判断链表中是…

内网渗透(七十九)之 CVE-2021-42287 权限提升漏洞

CVE-2021-42287 权限提升漏洞 漏洞背景 2021年11月9日,微软发布11月份安全补丁更新。在该安全补丁更新中,修复了两个域内权限提升漏洞CVE-2021-42287 、CVE-2021-42278。当时这两个漏洞的利用详情和POC并未公布,因此并未受到太多人关注。 一个月后,国外安全研究员公布了…

[CTF/网络安全] 攻防世界 ics-06 解题详析

[CTF/网络安全] 攻防世界 ics-06 解题详析 姿势&#xff08;Burp爆破&#xff09; 题目描述&#xff1a;云平台报表中心收集了设备管理基础服务的数据&#xff0c;但是数据被删除了&#xff0c;只有一处留下了入侵者的痕迹。 可知&#xff1a;报表中心含有部分数据 仅报表中心…

C++内存管理/函数模板/类模板

一、C内存管理 C中内存基本形式与C语言类似&#xff0c;可以参考下图。 X64环境下总共大小为8G,X86环境下为4G。 1、内核空间&#xff1a;用户不能读写&#xff0c;但要占用一定空间。 2、栈区&#xff1a;以开辟、销毁栈帧形式运行&#xff0c;主要应用于局部变量和函数栈帧…

chatgpt赋能Python-python3_choice

Python3中的choice()函数&#xff1a;一种简单而有趣的随机选择方式 在Python3中&#xff0c;choice()函数是一个常见的随机模块。它允许我们从一个序列中随机选择一个元素。这在程序中经常用于生成一些需要随机展示的数据。本文将介绍Python3中的choice()函数&#xff0c;并探…

00.SpringCloud服务调用方式

服务调用方式 RPC和HTTP 无论是微服务还是SOA&#xff0c;都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢&#xff1f; 常见的远程调用方式有以下2种&#xff1a; RPC&#xff1a;Remote Produce Call远程过程调用&#xff0c;类似的还有 。自定义数据格式&am…

合合信息亮相CCIG2023:多位大咖共话智能文档未来,文档图像内容安全还面临哪些技术难题?

近日&#xff0c;中国图象图形大会&#xff08;CCIG 2023&#xff09;&#xff08;简称“大会”&#xff09;在苏州圆满落幕。本届大会以“图象图形向未来”为主题&#xff0c;由中国科学技术协会指导&#xff0c;中国图象图形学学会主办&#xff0c;苏州科技大学承办&#xff…

干货 | 利用SPSS进行高级统计第一期(更新)

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 在之前的文章中&#xff0c;我们以此介绍了如何利用SPSS进行高级统计分析&#xff0c;内容包括&#xff1a; (1)描述性统计表格模板、卡方&T检验、相关&回归分析 (2)中介、多重中…

MD5_buuctf

概念 MD5信息摘要算法&#xff0c;一种被广泛使用的密码散列函数&#xff0c;可以产生出一个128位&#xff08;16字节&#xff09;的散列值&#xff08;hash value&#xff09;&#xff0c;用于确保信息传输完整一致。 MD5算法具有以下特点&#xff1a; 压缩性&#xff1a;任意…

一次失败的面试经历:我只想找个工作,你却看不起我?还用面试题羞辱我...

这段时间都说难找工作&#xff0c;没有面试机会。面对如此严峻的形式&#xff0c;很多软件测试人员都希望能拿一个满意的高薪offer&#xff0c;但是随着招聘职位的不断增多&#xff0c;面试的难度也随之加大&#xff0c;而面试官更是会择优录取 我最近为面试已经焦头烂额了&am…

循坏队列+OJ题之设计循环队列

生命不是要等待风暴过去&#xff0c;而是要学会在风暴中跳舞。 ——卡莉尔吉布朗目录 &#x1f33a;前言&#xff1a; &#x1f341;一.循环队列是什么&#xff1f; &#x1f34f;二.循环队列有什么作用&#xff1f; &#x1f340;三.OJ题之设计循环队列 1…

C++(3):字符串、向量和数组

命名空间的 using 声明 using namespace::name;1.每个名字都需要独立的 using 声明&#xff1b; 2.头文件不应包含 using 声明&#xff1a; 因为头文件的内容会拷贝到所有引用它的文件中去&#xff0c;如果头文件里有某个using声明&#xff0c;那么每个使用了该头文件的文件就…

Apache Kafka - 重识Kafka生产者

文章目录 概述Kafka 生产者Kafka 生产者工作原理如何使用 Kafka 生产者 生产者配置项&#xff08;核心&#xff09;导图总结 概述 Kafka 生产者是 Apache Kafka 中的一个重要组件&#xff0c;它负责将数据发送到 Kafka 集群中。在实时数据处理和流式处理应用程序中&#xff0c…

如何自建个人音乐播放器Navidrome

文章目录 1. 前言2. Navidrome网站搭建2.1 Navidrome下载和安装2.1.1 安装并添加ffmpeg2.1.2下载并配置Navidrome2.1.3 添加Navidrome到系统服务 2.2. Navidrome网页测试 3. 本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4. 公网访问测试5. 结语 转…

【总结】Nupmy1

Nupmy numpy的核心是名为ndarray的数据类型&#xff0c;它代表多维数组&#xff0c;封装了操作数据的运算和方法 1. 创建数组对象 1.1 方法1:array 通过array将list转换成数据对象 # 通过array将list转换成数据对象 array1np.array([1,2,3,4,5]) array1 # array([1, 2, 3,…

Nginx + fastCGI 实现动态网页部署

简介 本文章主要介绍下&#xff0c;如何通过Nginx fastCGI来部署动态网页。 CGI介绍 在介绍fastCGI之前先介绍下CGI是什么。CGI : Common Gateway Interface&#xff0c;公共网关接口。在物理层面上是一段程序&#xff0c;运行在服务器上&#xff0c;提供同客户端HTML页面的…

测试理论----Bug的严重程度(Severity)和优先级(Priority)的分类

【原文链接】测试理论----Bug的严重程度&#xff08;Severity&#xff09;和优先级&#xff08;Priority&#xff09;的分类 一、Bug的严重程度&#xff08;Severity&#xff09; Bug的Severity&#xff08;严重程度&#xff09;指的是一个Bug对软件系统功能影响的程度&#…

Java常用工具之Collections

目录 一、排序操作二、查找操作三、同步控制三、不可变集合四、其他五、CollectionUtils&#xff1a;Spring 和 Apache 都有提供的集合工具类六 、小结 Collections 是 JDK 提供的一个工具类&#xff0c;位于 java.util 包下&#xff0c;提供了一系列的静态方法&#xff0c;方便…