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

 

posted @ 2023-07-06 14:18  zeran  阅读(44)  评论(0编辑  收藏  举报