cmake 交叉编译添加zlib库

一、下载源码并编译

下好后编译步骤:

1.解压 tar -xzvf zlib-1.2.11.tar.gz -C ./

2.配置编译环境 source /opt/LTBOXCL02-linuxAPP/environment-setup-armv7a-vfp-neon-oe-linux-gnueabi

3.配置安装目录 ./configure --prefix=../Install

4.编译 make &make install

二、添加 libz.so.1.2.11 到测试demon中

 

 三、测试demon源码

 

int zlib_mem_test()
{
int err = 0;
Byte compr[200] = { 0 }, uncompr[200] = { 0 }; // big enough
uLong comprLen = 200, uncomprLen = 200;

const char* hello = "12345678901234567890123456789012345678901234567890";

uLong len = strlen(hello) + 1;
comprLen = sizeof(compr) / sizeof(compr[0]);

err = compress(compr, &comprLen, (const Bytef*)hello, len);

if (err != Z_OK)
{
printf("compess error:%d", err);
exit(1);
}
cout << "orignal size: " << len << " , compressed size : " << comprLen << ",compress data:" << compr << endl;

//strcpy((char*)uncompr, "garbage");

err = uncompress(uncompr, &uncomprLen, compr, comprLen);

if (err != Z_OK)
{
cout << "uncompess error: " << err << '\n';
exit(1);
}

cout << "orignal size: " << len << " , uncompressed size : " << uncomprLen << endl;

if (strcmp((char*)uncompr, hello))
{
cout << "BAD uncompress!!!\n";
exit(1);
}
else
{
cout << "uncompress() succeed: \n" << (char*)uncompr << endl;;
}
}

/* report a zlib or i/o error */
void zerr(int ret,int type)
{
printf("zpipe: ");
switch (ret) {
case Z_ERRNO:
if (type == 0)
printf("error reading stdin\n");
else
printf("error writing stdout\n");
break;
case Z_STREAM_ERROR:
printf("invalid compression level\n");
break;
case Z_DATA_ERROR:
printf("invalid or incomplete deflate data\n");
break;
case Z_MEM_ERROR:
printf("out of memory\n");
break;
case Z_VERSION_ERROR:
printf("zlib version mismatch!\n");
}
}

#define CHUNK 16384
int def(FILE *source, FILE *dest, int level)
{
int ret, flush;
unsigned have;
z_stream strm;
unsigned char in[CHUNK];
unsigned char out[CHUNK];

/* allocate deflate state */
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
ret = deflateInit(&strm, level);
if (ret != Z_OK)
return ret;

/* compress until end of file */
do {
strm.avail_in = fread(in, 1, CHUNK, source);
if (ferror(source)) {
(void)deflateEnd(&strm);
return Z_ERRNO;
}
flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
strm.next_in = in;

/* run deflate() on input until output buffer not full, finish
compression if all of source has been read in */
do {
strm.avail_out = CHUNK;
strm.next_out = out;
ret = deflate(&strm, flush); /* no bad return value */
assert(ret != Z_STREAM_ERROR); /* state not clobbered */
have = CHUNK - strm.avail_out;
if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
(void)deflateEnd(&strm);
return Z_ERRNO;
}
} while (strm.avail_out == 0);
assert(strm.avail_in == 0); /* all input will be used */

/* done when last data in file processed */
} while (flush != Z_FINISH);
assert(ret == Z_STREAM_END); /* stream will be complete */

/* clean up and return */
(void)deflateEnd(&strm);
return Z_OK;
}
int inf(FILE *source, FILE *dest)
{
int ret;
unsigned have;
z_stream strm;
unsigned char in[CHUNK];
unsigned char out[CHUNK];

/* allocate inflate state */
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.avail_in = 0;
strm.next_in = Z_NULL;
ret = inflateInit(&strm);
if (ret != Z_OK)
return ret;

/* decompress until deflate stream ends or end of file */
do {
strm.avail_in = fread(in, 1, CHUNK, source);
if (ferror(source)) {
(void)inflateEnd(&strm);
return Z_ERRNO;
}
if (strm.avail_in == 0)
break;
strm.next_in = in;

/* run inflate() on input until output buffer not full */
do {
strm.avail_out = CHUNK;
strm.next_out = out;
ret = inflate(&strm, Z_NO_FLUSH);
assert(ret != Z_STREAM_ERROR); /* state not clobbered */
switch (ret) {
case Z_NEED_DICT:
ret = Z_DATA_ERROR; /* and fall through */
case Z_DATA_ERROR:
case Z_MEM_ERROR:
(void)inflateEnd(&strm);
return ret;
}
have = CHUNK - strm.avail_out;
if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
(void)inflateEnd(&strm);
return Z_ERRNO;
}
} while (strm.avail_out == 0);

/* done when inflate() says it's done */
} while (ret != Z_STREAM_END);

/* clean up and return */
(void)inflateEnd(&strm);
return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
}

int main(int argc, char* argv[])
{
FILE *fin = fopen("/data/app/Status.log", "ab+");
FILE *fout = fopen("/run/Status.tar.gz", "ab+");
FILE *ftest = fopen("/run/zlib.log", "ab+");
if (fin == NULL || fout == NULL)
{
printf("open file failed!\n");
}

int def_ret = def(fin, fout, Z_DEFAULT_COMPRESSION);
if (def_ret != Z_OK)
{
zerr(def_ret, 0);
return def_ret;
}
fseek(fout, 0, SEEK_SET);
printf("begin to inflate");
int inf_ret = inf(fout, ftest);
if (inf_ret != Z_OK)
zerr(inf_ret,1);
zlib_mem_test();
return 0;

}

 

posted on 2019-06-25 10:11  吃橙子  阅读(2577)  评论(0编辑  收藏  举报

导航