c++编译zlib3--7.13

xiaoxiao2021-02-28  76

"/cygdrive/c/CrossBridge_15.0.0.3/sdk/usr/bin/g++"

使用命令用g++来编译.cpp文件:

将已经修改好并可用的cpp文件源码如下:

#include <cstring> #include <cstdlib> #include <iostream> #include "zlib.h" using namespace std; //int Compress(char * DestName, const char *SrcName); //int UnCompress(char * DestName, const char *SrcName); int Compress(const char * DestName, const char *SrcName); int UnCompress(const char * DestName, const char *SrcName); int main() { const char *str = "1.zip"; const char *str2 = "11.docx"; //Compress("1.zip", "11.docx"); Compress(str, str2); const char *str3 = "22.docx"; const char *str4 = "1.zip"; UnCompress(str3, str4); //UnCompress("22.docx", "1.zip"); } int Compress(const char * DestName, const char *SrcName) { char SourceBuffer[102400] = { 0 }; //压缩文件时的源buffer FILE* fp; //打开欲压缩文件时文件的指针 FILE* fp1; //创建压缩文件时的指针 //errno_t err; //错误变量的定义 int err; #ifdef WINDOWS_PLATFORM //err = fopen_s(&fp, SrcName, "r+b");//打开欲压缩的文件 fp = fopen(SrcName, "r+b") //if (err) //{ // printf("文件打开失败! \n"); // return 1; //} #endif #ifdef WINDOWS_CE_PLATFORM //fp = fopen_s(SrcName, "r+b");//打开欲压缩的文件 fp = fopen(SrcName, "r+b") if (fp) { printf("文件打开失败! \n"); return 1; } #endif //err = fopen_s(&fp, SrcName, "r+b");//打开欲压缩的文件 fp = fopen(SrcName, "r+b"); //if (err) //{ // printf("文件打开失败! \n"); // return 1; //} //获取文件长度 long cur = ftell(fp); fseek(fp, 0L, SEEK_END); long fileLength = ftell(fp); fseek(fp, cur, SEEK_SET); //读取文件到buffer fread(SourceBuffer, fileLength, 1, fp); fclose(fp); //压缩buffer中的数据 uLongf SourceBufferLen = 102400; char* DestBuffer = (char*)::calloc((uInt)SourceBufferLen, 1); err = compress((Bytef*)DestBuffer, (uLongf*)&SourceBufferLen, (const Bytef*)SourceBuffer, (uLongf)fileLength); if (err != Z_OK) { cout << "压缩失败:" << err << endl; return 1; } //创建一个文件用来写入压缩后的数据 //err = fopen_s(&fp1, DestName, "w+b"); fp1 = fopen(DestName, "w+b"); if (!fp1) { printf("压缩文件创建失败! \n"); return 1; } fwrite(DestBuffer, SourceBufferLen, 1, fp1); fclose(fp1); return 0; } int UnCompress(const char * DestName, const char *SrcName) { char uSorceBuffer[102400] = { 0 }; //解压缩文件时的源buffer FILE* fp3; //打开欲解压文件的文件指针 FILE* fp4; //创建解压文件的文件指针 int err; //errno_t err; //错误变量的定义 //打开欲解压的文件 //err = fopen_s(&fp3, SrcName, "r+b"); fp3 = fopen(SrcName, "r+b"); //if (err) //{ //printf("文件打开失败! \n"); //return 1; //} //获取欲解压文件的大小 long ucur = ftell(fp3); fseek(fp3, 0L, SEEK_END); long ufileLength = ftell(fp3); fseek(fp3, ucur, SEEK_SET); //读取文件到buffer fread(uSorceBuffer, ufileLength, 1, fp3); fclose(fp3); uLongf uDestBufferLen = 1024000;//此处长度需要足够大以容纳解压缩后数据 char* uDestBuffer = (char*)::calloc((uInt)uDestBufferLen, 1); //解压缩buffer中的数据 err = uncompress((Bytef*)uDestBuffer, (uLongf*)&uDestBufferLen, (Bytef*)uSorceBuffer, (uLongf)ufileLength); if (err != Z_OK) { cout << "解压缩失败:" << err << endl; return 1; } //创建一个文件用来写入解压缩后的数据 //err = fopen_s(&fp4, DestName, "wb"); fp4 = fopen(DestName, "wb"); //if (err) //{ //printf("解压缩文件创建失败! \n"); //return 1; //} printf("写入数据... \n"); fwrite(uDestBuffer, uDestBufferLen, 1, fp4); fclose(fp4); return 0; }

上面出现的主要问题是,它无法识别源码中的_uncompree与_compress函数,这两个函数引用在zlib.h,必须链接相应库才可以。(这里我把zlib.dll,zlib.lib文件也放在了编译的zlib的文件夹下)

"/cygdrive/c/CrossBridge_15.0.0.3/sdk/usr/bin/g++"liu.cpp -o liu.exe –lz

命令必须写加上-lz才能成功。

是因为:libz.a库提供压缩函数,即buffer压缩函数,在网络通信中,server可能需要将应答结果打包压缩发送给客户端。这样通信比较容易。

参考文献:http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201132951610578/

 

编译后生成的exe文件仍有一些问题:

然后从

路径中把这三个文件copy至exe同一路径下,然后再次启动就能成功了。

在路径下创建相应的输入文件11.docx就能成功看到输出结果了。

转载请注明原文地址: https://www.6miu.com/read-63838.html

最新回复(0)