正文11(补充):测试zlib库的使用及用cmake静态编译

一:zlib简介:

zlib是提供数据压缩用的函式库,由Jean-loup Gailly与Mark Adler所开发。

二:linux编译:

sudo tar -zxvf zlib-1.2.11.tar.gz -C .
sudo chown -R aston zlib-1.2.11
mkdir install_lib
sudo ./configure --prefix=/home/aston/huawei/zlib-1.2.11/install_lib
sudo make
sudo make install

三、linux测试代码

  • 编译指令

g++ test_zlib.cpp -I./include -L./lib -lz -o app.out
-I指定头文件,-L指定库

  • 代码
#include <stdio.h>
#include <zlib.h>
 
int main(int argc,char **args)
{
    
    
    /*原始数据*/
    unsigned char strsrc[] = "这些是测试数据。123456789 abcdefghigklmnopqrstuvwxyz\n\t\0abcdefghijklmnopqrstuvwxyz\n"; //包含\0字符
    unsigned char buf[1024] = {
    
    0};
    unsigned char strdst[1024] = {
    
    0};
    unsigned long srclen = sizeof(strsrc);
    unsigned long buflen = sizeof(buf);
    unsigned long dstlen = sizeof(strdst);
	
    int i;
    FILE *fp = NULL;
 
    printf("源串:");
    for(i=0;i<srclen;++i)
    {
    
    
        printf("%c",strsrc[i]);
    }
    printf("原串长度为:%ld\n",srclen);
 
    printf("字符串预计算长度为:%ld\n",compressBound(srclen));
	
    //压缩
    compress(buf,&buflen,strsrc,srclen);

	printf("\nbuf start, buflen = %ld\n",buflen);
    for(i=0;i<buflen;++i)
    {
    
    
        printf("%x",buf[i]);
    }	
	printf("\nbuf end\n");
	
	
    printf("压缩后实际长度为:%ld\n",buflen);
    //解压缩
    uncompress(strdst,&dstlen,buf,buflen);
 
    printf("目的串:");
    for(i=0;i<dstlen;++i)
    {
    
    
        printf("%c",strdst[i]);
    }
 
    return 0;
}
  • 打印效果
aston@ubuntu:/mnt/hgfs/share/source_insight/main_135/test_zlib$ ./app.out 
源串:这些是测试数据。123456789 abcdefghigklmnopqrstuvwxyz
	abcdefghijklmnopqrstuvwxyz
原串长度为:83
字符串预计算长度为:96

buf start, buflen = 71
789cbbfae8c2ca53c7373d3a75e5d4df7d77172e36343236313533b7b054484c4a4e494d4bcfc84ccfcec9cdcb2f282c2a2e292d2bafa8ace2e264804b6661483200c76924ef
buf end
压缩后实际长度为:71
目的串:这些是测试数据。123456789 abcdefghigklmnopqrstuvwxyz
	abcdefghijklmnopqrstuvwxyz

四.vs传递命令行参数

在这里插入图片描述
在这里插入图片描述

五.windows测试zlib代码

  • 准备工作
1)使用zlib静态库:zlibstat.lib
1. 包含头文件

    属性--C/C++--常规--附加包含目录(添加包含.h文件的目录)

2. 定义宏

    属性--C/C++--预处理器--预处理器定义:添加 ZLIB_WINAPI ASMV ASMINF

3. 项目包含.lib文件所在的目录:

    属性--链接器--常规--附加库目录

4. 项目包含.lib文件

    属性--链接器--输入--附加依赖项(libstat.lib)

5. 项目代码中 #include "zlib.h"

编译生成.exe即可使用。
-------------------------------------
2)使用动态库 zlibwapi.lib
1. 包含头文件

    属性--C/C++--常规--附加包含目录(添加包含.h的目录)

2. 定义宏

    属性--C/C++--预处理器--预处理器定义:添加 ZLIB_WINAPI

3. 项目包含.lib文件所在的目录:

    属性--链接器--常规--附加库目录

4. 项目包含.lib文件

    属性--链接器--输入--附加依赖项(zlibwapi.lib)

5. 项目代码中 #include "zlib.h"

编译生成.exe文件需要.dll文件支持(动态加载)
#include <stdlib.h> 
#include <stdio.h> 
#include <zlib.h> 
int main(int argc, char* argv[])
{
    
    
    FILE* file;
    uLong flen;
    unsigned char* fbuf = NULL;
    uLong clen;
    unsigned char* cbuf = NULL;
    /* 通过命令行参数将srcfile文件的数据压缩后存放到dstfile文件中 */
    if (argc < 3)
    {
    
    
        printf("Usage: zcdemo srcfile dstfile\n");
        return -1;
    }
 
    if ((file = fopen(argv[1], "rb")) == NULL)
    {
    
    
        printf("Can\'t open %s!\n", argv[1]);
        return -1;
    }
    /* 装载源文件数据到缓冲区 */
    fseek(file, 0L, SEEK_END);    /* 跳到文件末尾 */
    flen = ftell(file);        /* 获取文件长度 */
    fseek(file, 0L, SEEK_SET);
    if ((fbuf = (unsigned char*)malloc(sizeof(unsigned char)* flen)) == NULL)
    {
    
    
        printf("No enough memory!\n");
        fclose(file);
        return -1;
    }
    fread(fbuf, sizeof(unsigned char), flen, file);
    /* 压缩数据 */
    clen = compressBound(flen);
    if ((cbuf = (unsigned char*)malloc(sizeof(unsigned char)* clen)) == NULL)
    {
    
    
        printf("No enough memory!\n");
        fclose(file);
        return -1;
    }
    if (compress(cbuf, &clen, fbuf, flen) != Z_OK)
    {
    
    
        printf("Compress %s failed!\n", argv[1]);
        return -1;
    }
    fclose(file);
 
    if ((file = fopen(argv[2], "wb")) == NULL)
    {
    
    
        printf("Can\'t create %s!\n", argv[2]);
        return -1;
    }
    /* 保存压缩后的数据到目标文件 */
    fwrite(&flen, sizeof(uLong), 1, file);    /* 写入源文件长度 */
    fwrite(&clen, sizeof(uLong), 1, file);    /* 写入目标数据长度 */
    fwrite(cbuf, sizeof(unsigned char), clen, file);
    fclose(file);
 
    free(fbuf);
    free(cbuf);
 
    return 0;
}
  • 注意:

fopen打不开文件,就用绝对目录

linux-》fopen

#include <stdio.h>

int main()
{
    
    
	FILE* f = fopen("/home/ztz123/Desktop/data/base/16384/16385", "r");
	int a;
	fseek(f,20,SEEK_SET);
	fscanf(f,"%d",a);
	printf("%d\n",a);
	fclose(f);
	return 0;
}

windows-》fopen(windows文件必须要用/,不能是windows默认的反斜杠\)

#include <stdio.h>
#pragma warning(disable:4996)//VS下一定要这个!
int main()
{
    
    
	FILE* f = fopen("D:/walk_sample.txt", "r");
	printf("%d\n", f);

	printf("%d\n", sizeof(int*));
	fclose(f);
	return 0;
}

六、cmake编译zlib的库

1)首先去官网,下载 zlib 的源码包。

在这里插入图片描述

2)在zlib解压目录创建_build目录

最新版本的 zlib 为 1.2.11。下载完成后,解压,找到 CMakeLists.txt 文件,用已经安装好的 CMake 软件打开,或者直接将该文件拖拽到 CMake 的 UI 界面上。在 Where to build the binaries 目录后面增加 _build 目录。这样可以确保生成的文件在 _build 目录中,而不会污染原有的 zlib 目录。

在这里插入图片描述

3)点击 Configure 按钮,生成配置信息,如果弹出新建 _build 目录确认的对话框,选择 Yes。

在这里插入图片描述
选择你想要编译的平台版本,这里使用 vs2019 编译 x64 位的静态库。

在这里插入图片描述

4)点击 Finish,CMake 会自动识别当前系统的配置信息,并生成相关的配置文件。

Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.18363.
The C compiler identification is MSVC 19.24.28315.0
Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.24.28314/bin/Hostx64/x64/cl.exe
Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.24.28314/bin/Hostx64/x64/cl.exe -- works
Detecting C compiler ABI info
Detecting C compiler ABI info - done
Detecting C compile features
Detecting C compile features - done
Looking for sys/types.h
Looking for sys/types.h - found
Looking for stdint.h
Looking for stdint.h - found
Looking for stddef.h
Looking for stddef.h - found
Check size of off64_t
Check size of off64_t - failed
Looking for fseeko
Looking for fseeko - not found
Looking for unistd.h
Looking for unistd.h - not found
Renaming
    C:/projects/zlib-1.2.11/zconf.h
to 'zconf.h.included' because this file is included with zlib
but CMake generates it automatically in the build directory.
Configuring done

如果界面显示红色,不用担心,再次点击 Configure 按钮即可消失。

这里面因为无需配置其它信息,所以可以直接点击 Generate 生成工程文件。接着点击 OpenProject 按钮打开工程即可。

5)接着打开工程

在这里插入图片描述
解决方案中的 zlib 可以编译动态库,zlibstatic 可以编译静态库,这里我们需要静态库,所以直接编译 zlibstatic 工程即可。但是按照 Debug/Release 和 /MT 以及 /MD 之分,至少可以组合四种配置,所以我们分别选择不同的配置属性,生成最后的四种库文件,并将它们放到不同的目录下。具体的配置方法可以查看 运行时库详解 这篇文章,每次修改配置都编译一次工程,编译成功后,将生成的结果放到一开始设定的目录下,最后的目录结构如下:

---
 |--- include //放头文件
 |--- lib
       |--- Debug
       |      |--- MDd
       |      |     |-- zlibstaticd.lib
       |      |
       |      |--- MTd
       |            |-- zlibstaticd.lib
       |
       |--- Release
              |--- MD
              |     |-- zlibstatic.lib
              |
              |--- MT
                    |-- zlibstatic.lib

6)免费zlib库下载连接

为了方便这里我打包了最后的结果,方便大家直接使用,不过这里只有 x64 版本,如果你的机器还是 32 位系统则无法使用。zlib 静态库下载

7)编译注意事项

这里有一点注意,在 include 头文件的目录里面需要加入 CMake 生成的 zconf.h 文件,这个文件默认生成在 _build/zconf.h 里面,如果忘记这个头文件,在使用 zlib 库的时候,可能会无法找到 zconf.h 而导致编译无法通过。

猜你喜欢

转载自blog.csdn.net/weixin_43679037/article/details/120878051
今日推荐