执行上面的代码,提示SzAr_Open找不到标识符
时间: 2024-03-05 21:53:18 浏览: 15
这个问题可能是由于缺少7z的头文件或者库文件的链接问题导致的。请确认您的项目中已经包含了以下头文件:
```c++
#include "7z.h"
#include "7zAlloc.h"
#include "7zCrc.h"
#include "7zFile.h"
#include "7zVersion.h"
```
另外,如果您是在Linux环境下进行编译,需要使用以下命令进行链接:
```bash
g++ -o main main.cpp -l7z
```
这样可以将7z的库文件链接到您的程序中,以便程序能够正常编译和运行。如果您是在Windows环境下进行编译,需要将7z的库文件添加到您的工程中,并将库文件的路径添加到链接器的路径中。
相关问题
执行上面一段代码后,提示NumFiles不是CSzArEx的成员
很抱歉,看来7z的库文件版本不同,在使用上有些许不同。以下是更新后的代码,可以解决这个问题:
```c++
#include <iostream>
#include <cstring>
#include <cstdio>
#include "7z.h"
#include "7zAlloc.h"
#include "7zCrc.h"
#include "7zFile.h"
#include "7zVersion.h"
using namespace std;
int extract_tar_gz(const char* archive, const char* extract_path){
CFileInStream archiveStream;
CLookToRead lookStream;
CSzAr db;
SRes res;
UInt16 *temp = NULL;
size_t tempSize = 0;
int extractCount = 0;
ISzAlloc allocImp;
ISzAlloc allocTempImp;
allocImp.Alloc = SzAlloc;
allocImp.Free = SzFree;
allocTempImp.Alloc = SzAllocTemp;
allocTempImp.Free = SzFreeTemp;
CrcGenerateTable();
if (InFile_Open(&archiveStream.file, archive)){
cout << "Error: Can not open file " << archive << endl;
return -1;
}
FileInStream_CreateVTable(&archiveStream);
LookToRead_CreateVTable(&lookStream, False);
lookStream.realStream = &archiveStream.s;
LookToRead_Init(&lookStream);
SzAr_Init(&db);
res = SzAr_Open(&db, &lookStream.s, &allocImp, &allocTempImp);
if (res != SZ_OK){
cout << "Error: Can not open archive " << archive << endl;
return -1;
}
for (UInt32 i = 0; i < db.NumFiles; i++){
size_t offset = 0;
size_t outSizeProcessed = 0;
const CSzFileItem* fileItem = db.Files + i;
size_t len = SzAr_GetFileNameUtf16(&db, i, NULL);
if (len > tempSize){
SzFree(NULL, temp);
tempSize = len;
temp = (UInt16*)SzAlloc(NULL, tempSize * sizeof(temp[0]));
}
SzAr_GetFileNameUtf16(&db, i, temp);
char* filename = (char*)malloc(len * 2 + 1);
wcstombs(filename, (wchar_t*)temp, len * 2 + 1);
if (fileItem->IsDir){
continue;
}
if(strstr(filename, ".tar.gz") == NULL){
continue;
}
char cmd[100];
sprintf(cmd, "7z x -so \"%s\" 2>/dev/null | tar -xz -C \"%s\"", filename, extract_path);
system(cmd);
extractCount++;
free(filename);
}
SzAr_Free(&db, &allocImp);
SzFree(NULL, temp);
File_Close(&archiveStream.file);
return extractCount;
}
int main(){
extract_tar_gz("test.tar.gz", "extract_path");
return 0;
}
```
这个问题是由于7z的库文件在不同的版本中,对于压缩包的结构定义有了不同的实现,导致数据结构发生了变化。因此,如果遇到类似的问题,需要仔细查看库文件的版本和API文档。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![md](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)