首页 > 系统相关 >网易博客旧文----zlib在windows上的编译

网易博客旧文----zlib在windows上的编译

时间:2024-10-27 09:46:24浏览次数:7  
标签:obj 函数 符号 windows zlib ---- 编译 error

zlib在windows上的编译
2013-01-31 17:38:29| 分类: 编程资料 | 标签: |举报 |字号大中小 订阅

因为要进行zip方面的开发,因此需要对于zlib库进行研究,需要编译一个库来使用,同时可以跟踪zlib代码实现,发现问题。

首先从http://www.zlib.net/下载了最新的源代码,版本是1.2.7
解压后,实际已经提供了在VC下编译的工程,目录为:
zlib-1.2.7\contrib\vstudio
其中只有vc9和vc10
因为我用的是vs2008,因此用vc9,打开项目后,其中的zlibstat是编译为静态库
zlibvc是编译为动态库,还有其它一些工程暂时未研究
编译动态库时碰到的第一个问题就是需要link两个文件,
…\masmx86\match686.obj
…\masmx86\inffas32.obj
这个两个文件如何编译呢?
只需要在命令行下设置好vc的编译环境后,执行bld_ml32.bat批处理即可生成需要的文件
如下图:

zlib在windows上的编译 - xzhoumin - MMZHOU的博客

编译生成的库为
ZlibStatDebug\zlibstat.lib

ZlibStatRelease\zlibstat.lib
写了一个例子想测试一下,结果出现链接错误:
1>unzip.obj : error LNK2019: 无法解析的外部符号_inflateInit2_,该符号在函数_unzOpenCurrentFile3 中被引用
1>unzip.obj : error LNK2019: 无法解析的外部符号_inflate,该符号在函数_unzReadCurrentFile 中被引用
1>unzip.obj : error LNK2019: 无法解析的外部符号_crc32,该符号在函数_unzReadCurrentFile 中被引用
1>zip.obj : error LNK2001: 无法解析的外部符号_crc32
1>unzip.obj : error LNK2019: 无法解析的外部符号_inflateEnd,该符号在函数_unzCloseCurrentFile 中被引用
1>zip.obj : error LNK2019: 无法解析的外部符号_get_crc_table,该符号在函数_zipOpenNewFileInZip4_64 中被引用
1>zip.obj : error LNK2019: 无法解析的外部符号_deflateInit2_,该符号在函数_zipOpenNewFileInZip4_64 中被引用
1>zip.obj : error LNK2019: 无法解析的外部符号_deflate,该符号在函数_zipWriteInFileInZip 中被引用
1>zip.obj : error LNK2019: 无法解析的外部符号_deflateEnd,该符号在函数_zipCloseFileInZipRaw64 中被引用
1>C:\test\testzlib\Debug\testzlib.exe : fatal error LNK1120: 8 个无法解析的外部命令

刚开始百思不得其解,后来用lib命令查看zlibstat.lib的符号,发现其中的函数名称会多一个@,比如
_get_crc_table在lib输出的符号中为_get_crc_table@0
这个肯定是问题所在,在网上看到如下资料:
(http://blog.csdn.net/shifters/article/details/7163844)
C语言通过不同的调用协议来产生修饰名称,当使用__cdecl(C调用协议)时,会在函数名称前加一个下划线,不考虑参数和返回值。使用__fastcall函数,在函数名称前后各加一@符号,后跟参数长度,不考虑返回值。例如extern “C” int __fastcall Test(int n)的修饰名称为@Test@4. 对于使用标准调用协议(__stdcall)的函数,在函数名称前加一下划线,后跟参数长度,不考虑返回值。如extern “C” int __stdcall Test (int n, int m) 的修饰名称为_Test@8

因此再回到zibstat的工程中
发现函数的定义中有ZEXPORT:
比如(zlib.h):
ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void));
而ZEXPORT的定义为(zconf.h):

define ZEXPORT WINAPI

而WINAPI的定义为(windef.h)
#define WINAPI __stdcall
因此生成的符号当然有个@加上参数长度了
找到问题后就好解决了,修改函数中ZEXPORT为ZEXPORTVA
#define ZEXPORTVA WINAPIV----->#define WINAPIV __cdecl
注意需要修改头文件和源代码。

另外
1、发现zlibvc.def文件在静态库中是不起作用的,只对动态库的输出符号有作用,这导致走了一点弯路
2、输出符号的方式,在/contrib/vstudio/vc9/x86/ZlibStatDebug下调用

“c:\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat”
创建编译环境,然后调用>dumpbin /symbols zlibstat.lib >t1.txt
即可在t1.txt文件中看到符号了。

提供一个网络盘下载zlib1.2.7:

下载: zlib-1.2.7.tar.gz

标签:obj,函数,符号,windows,zlib,----,编译,error
From: https://blog.csdn.net/XZHOUMIN/article/details/143264787

相关文章

  • 大数据技术045_python国潮男装微博评论数据分析系统的设计与实现 django flask爬虫可
    目录具体实现截图技术栈预期达到的目标开发技术介绍论文大纲目录编码规范核心代码部分展示其他项目推荐详细视频演示源码获取方式具体实现截图技术栈Python也提供了数据库的操作接口,通过引入Python的MySQL处理对象连接数据库后,使用通用的SQL语句方法实现数......
  • CSP-S-2024 游记(寄)
    CSP-S-2024游记前言菜。Day-4补勰码题。补到了一半多。Day-3补勰码题。补到了二十多题。Day-2模拟赛,摆。0+0+0+0=0pts。复习了割点。打了两把区间加区间和线段树。情绪不太好。数据删除Day-1模拟赛,摆……不全是。10+20+20+0=50pts,甚至写了最低档暴力。垫底。不......
  • 100种算法【Python版】第13篇——埃拉托斯特尼素数筛法
    本文目录1基本原理2算法步骤2.1初始化:2.2标记非素数:2.3收集素数:3数学示例4python代码1基本原理埃拉托斯特尼筛法(SieveofEratosthenes)是一种经典的算法,用于高效地寻找一定范围内的所有素数。该算法以古希腊数学家埃拉托斯特尼命名,具有简单易懂......
  • Anaconda Pytorch 深度学习入门记录
    环境我这里用的是Anaconda最新的版本24.9.2,创建的pyton版本是3.9,虚拟环境名叫pytorch,下载的pytorch版本是12.1初步配置创建虚拟环境首先进入Anaconda的终端,然后运行condacreate-nxxxpython=3.9创建一个虚拟环境,这里xxx是虚拟环境的名字,后面跟着的是python的版本然后用con......
  • 在图像处理中,散度 div 具体的作用是什么
    在图像处理中,散度(divergence)通常用于量化一个向量场中的向量是如何相互远离或靠近的。图像可被视为矢量场,每一个像素点具有一定的矢量值,这些像素点的向量值可代表了不同的图像特性,如边缘、纹理等。在图像处理的环境下,散度在检测图像特征、边缘检测、图像分割以及光流估计等方面扮......
  • Windows11 C盘扩容
    https://www.pcoic.com/system/windows/218.htmlWindows系统内置了一个强大的工具——磁盘管理,下文我将模拟日常需求,分别演示新建、合并分区,以及分配和修改盘符的操作。一、新建分区这是电脑用户最主要的需求。前两三年SSD的价格还比较高,高端电脑普遍采取SSD+HDD的组合......
  • 【Android Studio】通过编辑setting.gradle文件,添加阿里仓库
    本人对AndroidStudio的了解非常初级,这篇blog主要是自用备忘性质。因为众所周知的原因,国外仓库访问很不方便,影响项目构建。所以需要添加国内仓库,而阿里云仓库属于比较知名的。阿里云仓库服务自AndroidStudioBumblebee(2021.1.1)开始,仓库地址的存放位置,从项目级别的build.gradl......
  • 怎样使用ThinkPHP6进行支付宝和微信支付操作
    ​本文将详细讲解如何在ThinkPHP6框架中实现支付宝和微信的支付功能:1.准备基础环境和工具;2.集成支付宝SDK;3.集成微信支付SDK;4.配置支付参数;5.处理支付回调。让您轻松为网站或应用集成流行的支付方式,为用户提供便捷的支付体验。1.准备基础环境和工具在开始之前,确保你已经......
  • 苹果笔记本和其他品牌笔记本在设计上有哪些不同
    本文对比分析了苹果笔记本与其他品牌笔记本在设计上的主要差异。主要内容包括:1.外观设计风格不同;2.材料和构建质量不同;3.操作系统和用户界面的设计不同;4.硬件配置和性能不同;5.创新技术的应用不同;6.环保和可持续性设计不同;7.价格和市场定位不同。通过这些方面的深入分析,本文旨在为......
  • CSP-S2024 油鸡
    我往前飞飞过一片时间海我们也曾在爱情里受伤害我看着路梦的入口有点窄我遇见你是最美丽的意外总有一天我的谜底会揭开写得很水,应付yly,可能还要删除一些关键词。\(\textup{Day-114514}\)停课搞竞赛,但是国庆作业没写完被心旷神怡发现了,于是喜提停课半天体验......