我正在尝试使用CMake构建zlib 1.2.8 for Windows,但是我遇到了构建错误,我不知道如何修复。
生成时没有错误,但在生成结果解决方案时,出现以下错误:
2〉------生成已开始:项目:zlib,配置:发布x64 -----
2〉正在创建库C:/用户/erik/文档/zlib/1.2.8/项目/zlib-1.2.8-vc 10/版本/zlib.lib和对象C:/用户/erik/文档/zlib/1.2.8/项目/zlib-1.2.8-vc 10/版本/zlib.exp
2〉充气对象:错误LNK 2019:函数inflate中引用了无法解析的外部符号inflate_fast
2〉反向对象:错误LNK 2001:无法解析的外部符号inflate_fast
2〉C:\用户\erik\文档\项目\版本\文件库. dll:致命错误LNK 1120:1个未解决的外部问题
我不知道该怎么办,所以我很感激你的帮助。
3条答案
按热度按时间k2arahey1#
根据https://wiki.apache.org/httpd/Win64Compilation,一个非常类似的错误意味着:
这意味着-DASMV -DASMINF或OBJ=“inffasx64.obj gvmat64.obj inffas8664.obj”中存在排印错误,因为inflate_fast在inffas8664.c中定义。
我能够成功地构建一个简单的:
我查看了我的cmake缓存,我发现AMD 64被设置为false,这与cmake-gui窗口显示的不同。将其设置为true会导致各种构建错误,尽管不是您显示的那些。
CMakeLists.txt说明此选项用于启用AMD 64汇编实现。不使用此选项似乎是最简单的解决方案。
0kjbasz62#
Visual Studio项目文件中需要包含contrib\masmx64\infas8664.c此文件包含
inflate_fast
函数,该函数调用相应asm
函数esyap4oy3#
重要说明
contrib/masmx目录早在2017年就被删除了*(在回答时,我正在处理包含它们的 v1.2.11*.zip* 文件),因此以下所有内容不再适用(OOTB)。
但是它们的引用没有被删除(至少没有从所有地方删除),所以如果它们被启用(从 CMake),构建将失败。
但是,我提交了**[GitHub]: madler/zlib - Re enable ASM speedups on Win(于 221007 被拒绝),因此以下内容**(再次)适用**。
有关从补丁程序中获益的可能方法(一次/如果接受),请检查[SO]: How to change username of job in print queue using python & win32print (@CristiFati's answer)(在最后)。
将上述补丁应用于(当前)master 分支:
使用以下脚本检查所有配置、运行和汇总结果。
输出:
正如所看到的,对于发布版本(大多数人感兴趣的),使用加速的速度增益并不是很大(有时甚至比 C 代码还慢)。这(加上缺乏维护)是禁用它们的原因之一。
原始答案
在使用汇编器加速时,我发现这个问题在(当前)最新版本上是可重现的:版本1.2.11([GitHub]: madler/zlib - ZLIB DATA COMPRESSION LIBRARY).
此错误仅发生(显然,OS:Win,构建工具链:VStudio 和汇编加速已启用):
下面是解压缩过程中的“callstack”(top -〉down 相当于 outer -〉inner)。
1.正常情况:
1.膨胀,膨胀
1.* 快速膨胀 (inffast.c)
1.一个人。
1.汇编程序案例:
1.膨胀,膨胀
1. 快速膨胀 ( 贡献/masmx 64/inffast8664.c*)
1.(* 属性/masmx 64/文件系统x64.asm *)
1.一个人。
问题:
***#2.2.**丢失("${ZLIB_SRC_DIR}/CMakeLists.txt” 不知道 * infast8664.c的任何信息),因此链断开,导致生成库的数据无效(不完整)。
溶液:
让 CMakeLists.txt 知道该文件,方法是添加:
在 line*~#158***处(由
if(MSVC)
和elseif (AMD64)
条件括起来)。同时发布全部更改。
以上是一个 diff。请参见[SO]: Run / Debug a Django application's UnitTests from the mouse right click context menu in PyCharm Community Edition? (@CristiFati's answer)(Patching UTRunner部分)了解如何在 Win 上应用补丁(基本上,以**一个“+"符号开头的每一行都进入,以一个“-"**符号开头的每一行都退出)。
我还提交了此修补程序:[GitHub]: madler/zlib - Ms VisualStudio - Assembler speedups on x64,但我关闭了它,因为它包含在开头的那个文件中。
输出:
备注:
更新 #0
[GitHub]:madler/zlib -在Windows上构建的ASM zlib给出了错误的结果(@madler的注解)声明(强调是我的):
使用了哪些汇编代码?在zlib的contrib目录中有一些。顺便说一下,contrib目录中的东西不是zlib的一部分。它只是为了方便起见而存在,并且被那些第三方贡献者支持(或不支持)。我所要做的就是从下一个发行版中删除这些有问题的代码。
编译警告也是如此(每个人都必须看到(并且很可能被忽略)):
显然,汇编器加速和 VStudio 沿着得不是很好。此外,在 x86(* pc 032 *)上,还存在一些问题:
可能不再适用:[SO]: module unsafe for SAFESEH image C++ (@NayanaAdassuriya's answer)提出了一个修复方法(尽管它与问题没有直接关系)。简而言之, infas32.asm * 和 linker 的选项[MS.Docs]: /SAFESEH (Image has Safe Exception Handlers)不匹配。要删除它,请执行以下操作之一:
由于我使用 CMake 为 CmdLine 进行构建,因此我找到了一个解决方法。在 CMakeFiles 生成之后(但在构建之前),我指定了它:
在 flags.make 文件(ASM_MASM_FLAGS)中
由于我构建了一个 static lib(对于 Debug 构建,我也需要这些符号),因此我还修改了[MS.Docs]: /Z7, /Zi, /ZI (Debug Information Format),因此我修改了同一个文件(C_FLAGS)
我确信 CMake 提供了一种以适当的方式完成上述任务的方法,但我没有找到它(也没有进行彻底的调查)
修复后,一切正常,性能改进与 * pc 064 * 类似。
如果有人需要它们,我已经在**[GitHub]: CristiFati/Prebuilt-Binaries - (master) Prebuilt-Binaries/ZLib**(有/没有加速)构建并放置了二进制文件。