#include <archive.h>报错

文章讲述了在Linux环境中,使用C++项目引用libarchive库时遇到的编译问题。通过下载并安装libarchive3.6.2,解决g++编译时找不到archive相关函数定义的错误。在编译时添加-lz选项,成功消除undefinedreference错误,最终完成编译生成可执行文件。
摘要由CSDN通过智能技术生成

#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;
}
<think>嗯,用户正在尝试在Ubuntu系统上安装与CUDA 10.1对应的LibTorch版本,但在复制cuDNN文件时遇到了问题。首先,我需要理清楚用户的操作步骤和错误原因。用户执行了nvcc -V,显示CUDA 10.1已安装。然后尝试复制cuDNN的头文件和库文件到CUDA目录,但提示文件不存在。接着在修改权限时同样失败,因为文件不存在。这说明用户在安装cuDNN时可能路径不正确,或者cuDNN没有正确解压到指定位置。 接下来,我需要考虑用户可能的操作流程。通常安装cuDNN需要从NVIDIA官网下载对应版本的压缩包,解压后复制文件到CUDA目录。用户的命令是sudo cp cuda/include/cudnn.h ...,但当前目录下的cuda文件夹可能不存在,或者cuDNN文件没有被正确解压到~/cuda中。这可能是因为用户没有正确解压文件到指定位置,或者路径错误。 然后,用户的问题不仅是cuDNN安装失败,还包括如何安装对应版本的LibTorch。需要确认LibTorch版本是否与CUDA 10.1兼容。PyTorch官网通常会提供不同版本的LibTorch,用户需要选择与CUDA 10.1匹配的版本。例如,PyTorch 1.8.x可能支持CUDA 10.1,但需要具体查看版本对应关系。 可能用户没有正确下载和解压cuDNN,导致文件缺失。需要指导用户检查下载和解压步骤,确认cudnn.h和libcudnn*文件的存在。另外,用户可能在解压cuDNN时没有使用正确的目录结构,导致文件路径错误。 对于LibTorch的安装,用户可能需要从官网下载对应CUDA 10.1的版本,并设置环境变量如LD_LIBRARY_PATH。同时,用户可能需要配置CMakeLists.txt来正确链接库。 总结下来,解决步骤应该是先解决cuDNN安装的问题,确保文件正确复制到CUDA目录,然后下载对应CUDA 10.1的LibTorch版本,配置环境变量和编译选项。需要逐步引导用户检查cuDNN的安装步骤,确认文件路径,然后处理LibTorch的安装和配置。</think>根据你提供的命令和报错信息,可以看出你在配置CUDA 10.1环境时遇到了cuDNN文件缺失的问题,同时涉及LibTorch版本匹配。以下是分步解决方案: --- ### 一、cuDNN安装问题分析 你遇到的`cp: cannot stat...`错误表明**原始文件路径不存在**,可能原因: 1. cuDNN未正确下载或解压 2. 解压路径与命令中的`~/cuda`不匹配 3. 文件层级结构不符合预期 --- ### 二、正确安装cuDNN步骤 1. **下载匹配版本** 需下载与**CUDA 10.1**兼容的cuDNN(建议选择[cuDNN v7.6.5](https://developer.nvidia.com/rdp/cudnn-archive)) ``` wget https://developer.nvidia.com/compute/machine-learning/cudnn/secure/7.6.5.32/Production/10.1_20191031/cudnn-10.1-linux-x64-v7.6.5.32.tgz ``` 2. **解压并验证文件** ```bash tar -xzvf cudnn-10.1-linux-x64-v7.6.5.32.tgz ls cuda/include/cudnn.h # 确认文件存在 ls cuda/lib64/libcudnn* # 确认库文件存在 ``` 3. **复制文件到CUDA目录** ```bash sudo cp cuda/include/cudnn.h /usr/local/cuda-10.1/include/ sudo cp cuda/lib64/libcudnn* /usr/local/cuda-10.1/lib64/ ``` 4. **设置权限**(此时文件已存在) ```bash sudo chmod a+r /usr/local/cuda-10.1/include/cudnn.h sudo chmod a+r /usr/local/cuda-10.1/lib64/libcudnn* ``` --- ### 三、LibTorch版本匹配指南 #### 1. 确定版本对应关系 CUDA 10.1建议选择**LibTorch 1.8.x**系列(参考PyTorch官方[版本兼容表](https://pytorch.org/get-started/previous-versions/)): ``` PyTorch 1.8.0 + CUDA 10.1 ``` #### 2. 下载预编译包 ```bash wget https://download.pytorch.org/libtorch/cu101/libtorch-cxx11-abi-shared-with-deps-1.8.0%2Bcu101.zip unzip libtorch-cxx11-abi-shared-with-deps-1.8.0+cu101.zip ``` #### 3. 配置环境变量 在`~/.bashrc`中添加: ```bash export LIBTORCH=/path/to/libtorch export LD_LIBRARY_PATH=$LIBTORCH/lib:$LD_LIBRARY_PATH ``` #### 4. 验证安装 创建`test.cpp`: ```cpp #include <torch/torch.h> int main() { torch::Tensor tensor = torch::rand({2,3}); std::cout << tensor << std::endl; } ``` 编译命令: ```bash g++ test.cpp -o test -I $LIBTORCH/include -L $LIBTORCH/lib -ltorch -lc10 ``` --- ### 四、常见问题排查 1. **cuDNN校验失败** 使用`md5sum`检查下载文件完整性: ```bash md5sum cudnn-10.1-linux-x64-v7.6.5.32.tgz # 对比官网提供的checksum ``` 2. **LibTorch链接错误** 确保使用**cxx11 ABI**版本: ```bash # 查看系统GLIBCXX版本 strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX ``` --- ### 五、版本对照表(关键) | 组件 | 推荐版本 | |-----------|----------------| | CUDA | 10.1 | | cuDNN | v7.6.5 | | LibTorch | 1.8.0+cu101 | | GCC | ≤ 8.3.0 | 通过以上步骤,你应该能成功配置CUDA 10.1环境并安装匹配的LibTorch。如果仍有问题,建议检查文件路径的拼写错误和权限问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值