用到zlib库的程序运行时报错:无法定位程序输入点createfile2于动态链接库KERNEL32.DLL上

本文介绍了解决zlib库在Windows环境下由于createfile2函数引起的编译问题的方法,包括宏条件修改、预处理器定义调整及链接器设置等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是因为createfile2至少要windows8及以上才支持,想知道原理的可参看https://msdn.microsoft.com/en-us/library/windows/desktop/hh449422(v=vs.85).aspx
不想知道的直接按下面的步骤重新编译zlib库。微笑

1.使用vs打开(我用的是2013)zlib-1.2.8\contrib\vstudio\vc11目录下的zlibvs.sln

2.在iowin32.c文件第 29行那段宏用#if _WIN32_WINNT >= _WIN32_WINNT_WIN8 和 #endif包裹,


然后右键 zlibvc-属性-配置属性-C/C++-预处理器定义中加入一行 _WIN32_WINNT=0x0601即可,编译

3.编译的时候会报:error LNK2026: 模块对于 SAFESEH 映像是不安全的。解决办法:右键 zlibvc-属性-配置属性-链接器-命令行 在后面加一行 /SAFESEH:NO 

4.之后还会报错:.\zlibvc.def(4): fatal error LNK1118: “VERSION”语句中的语法错误。解决办法,直接定位到该错误,删除VERSION那一行即可

5.直接把生成的zlibwapi.dll和zlibwapi.lib(在 x86\ZlibDllDebug目录下)拷贝到需要使用该库的工程中去~


参考博文:http://blog.youkuaiyun.com/drecik__/article/details/50342357

<think>好的,用户遇到了一个关于程序无法定位输入的问题,具体是“无法定位程序输入_z20qResourceFeatureZlibv于动态链接库xxx.exe上”。我需要先分析可能的原因,然后给出解决方案。 首先,这个错误通常发生在程序运行动态链接库DLL)中找不到特定的函数入口。这里的函数名_z20qResourceFeatureZlibv看起来像是经过C++名称修饰后的符号,可能来自Qt框架,特别是涉及资源或Zlib相关的部分。 接下来,可能的原因有几个:一是Qt版本不兼容,编译使用的Qt版本和运行环境中的版本不一致;二是缺少必要的Qt组件或依赖,比如Zlib支持;三是环境变量设置问题,导致程序找不到正确的DLL路径;还有可能是程序本身或依赖的DLL文件损坏。 针对这些可能性,解决方案应该包括检查Qt版本是否一致,确保所有依赖的DLL存在且版本正确,特别是Qt5Core.dllzlib相关的。另外,使用Dependency Walker工具分析依赖关系,查看是否有缺失或冲突的DLL。重新部署程序,使用windeployqt工具自动收集依赖项,也是一个有效的方法。最后,检查系统环境变量,确保程序能找到正确的路径。 需要提醒用户注意,如果程序是第三方软件,可能需要联系开发者获取正确版本。如果是自己开发的,要确保部署环境与构建环境一致。此外,安装Visual C++ Redistributable可能解决运行缺失的问题。 总结步骤,要分列出,清晰易懂,让用户能逐步排查问题。同,使用中文,避免专业术语过于复杂,必要解释工具的使用方法,比如windeployqt和Dependency Walker。</think>这是一个典型的Windows系统动态链接库(DLL)依赖问题,以下是详细分析及解决方案: **错误原因分析:** 1. **Qt版本不匹配**:`_z20qResourceFeatureZlibv`是Qt框架中经过名称修饰(mangled name)的符号,通常出现在QtCore组件中 2. **缺少必要依赖**:程序需要Qt的Zlib压缩支持但未找到 3. **DLL冲突**:存在多个不同版本的Qt导致加载错误 4. **部署不完整**:打包遗漏了必要的运行组件 **逐步解决方案:** 1. **检查Qt运行版本** - 确认程序使用的Qt版本(如Qt 5.15.2) - 在部署目录检查`Qt5Core.dll`文件属性中的详细版本信息 - 确保所有Qt DLL来自同一版本构建包 2. **部署Zlib相关组件** - 在程序目录添加: ``` zlib.dll libzlib.dll # 某些构建可能需要 icudtXX.dll # ICU数据文件(XX对应版本号) icuinXX.dll icuucXX.dll ``` 3. **使用Qt部署工具** 在Qt命令行执行: ```bash windeployqt --release --qmldir [QML目录] [你的程序.exe] ``` 该工具会自动收集所有依赖项 4. **检查依赖关系** - 使用Dependency Walker(depends.exe)分析: - 打开有问题的exe文件 - 查找标红的缺失DLL - 注意黄色警告提示的版本冲突 5. **环境变量检查** - 删除或重命名系统PATH中的其他Qt路径 - 确保程序目录优先于系统目录加载DLL 6. **开发环境验证** - 如果是自行开发的程序: ```bash qmake -v # 确认Qt版本 nmake clean # 清理旧构建 qmake && nmake # 重新构建 ``` **特殊情况处理:** - 如果使用静态编译构建Qt: ```pro CONFIG += static QTPLUGIN += qico qsvg ``` 需在.pro文件中显式包含所有插件 - 对于使用`Q_INIT_RESOURCE`的情况: ```cpp #include <QResource> int main(int argc, char *argv[]) { Q_INIT_RESOURCE(myresource); // 确保资源文件已编译 // ... } ``` **建议的预防措施:** 1. 在目标机器安装对应版本的[Visual C++ Redistributable](https://aka.ms/vs/16/release/vc_redist.x64.exe) 2. 使用Enigma Virtual Box等工具打包成单文件 3. 定期使用`DLL Export Viewer`检查导出函数列表 如果问题仍未解决,建议提供以下信息以便进一步诊断: - 完整的错误截图 - 使用的Qt版本(`qmake -v`输出) - `ldd`命令的输出结果(可通过Visual Studio命令提示符获取)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值