dumpbin工具使用-由zlib编译前缀少加预处理器命令引起的异常-扩展
对zlib使用vs2019编译,没有在预处理器中加前缀命令,导致编译出来的zlib.dll 与项目之前使用的函数名不一致,运行报错。
报错信息:无法在DLL“libz64”中找到名为“Z_inflateEnd”的入口点。
在z.conf 中有以下注释:
/*
* If you *really* need a unique prefix for all types and library functions,
* compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
* Even better than compiling with -DZ_PREFIX would be to use configure to set
* this permanently in zconf.h using "./configure --zprefix".
*/
#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */
/* all linked symbols */
# define _dist_code z__dist_code
# define _length_code z__length_code
…………以下省略…………
这是种表明,如果要在函数库中加前缀需要使用 Z_PREFIX ,奈何对vs编译c++程序不了解,不知道这个命令该加在哪里,根据z.conf 的代码看到应该就是因为这个命令导致没有加上前缀: #ifdef Z_PREFIX /* may be set to #if 1 by ./configure */
最后找到问题解决方案:使用vs2019编译时需要在项目属性-->c/c++-->预处理器-->预处理定义中增加Z_PREFIX;注:编译win32版本zlib需要example、minigzip属性中也加Z_PREFIX 预处理器定义
以下为dumpbin使用:
报错无法在DLL“libz64”中找到名为“Z_inflateEnd”的入口点。之后猜测是编译出的dll不存在这个函数,网上搜了下了解到dumpbin这个工具,vs2019带这个工具,vs应该都带的,
cmd到dumpbin.exe 安装目录,
例如:D:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\bin\Hostx64\x64
或者以下方式:
1、使用 dumpbin -exports ***.dll 可将对应的dll文件直接拖入命令行, 自动显示dll的完整路径 输入命令后,点击Enter键,即可显示dll中包含的函数
查看dll函数也可使用工具:ViewApi.exe,https://www.xitongzhijia.net/soft/89773.html,与使用dumpbin -exports 效果一致
2、dumpbin -dependents ***.dll
由于项目要求不安装vc++运行时,把需要的dll都引入到项目内,所以用dumpbin -dependents ***.dll 查看有哪些依赖,然后在c:\Windows\SysWoW64 或c:\Windows\System32 中找到,拷贝到dll所在的同级目录
dumpbin还有其他命令,参考:
https://www.likecs.com/show-204206684.html
注:本文引用部分内容来自:https://blog.csdn.net/weixin_40333655/article/details/102802479