使用VS2022编译7zip的控制台程序

7zip除了官方下载安装的图形界面工具之外,是有独立控制台程序的,在CPP\7zip\Bundles里面。这个控制台程序还分为全功能版(7zz)的和精简的(7zr),但官方那边能下载到的只有精简的,全功能的那个要自己编译。

在用VS2022编译全功能版的时候我遇到了问题。虽然官方提供了nmake用的编译脚本,但是它跑起来总是报错,而且报错的地方在Windows SDK里面、而不是7z自己的代码。报的错误是C2279,出现在mapi.h头文件里、诸如“这个typedef地方不能写throw标识符”这样的东西。

网上搜索之后能找到的相关的东西不太多,有一个说法是C++标准的问题,现在的Windows SDK需要配合新版本的C++标准(C++17之类)才能正常使用。看了一下7zip源码里nmake脚本加的参数,也确实没有指定标准。

本来想试试换个旧版的Windows SDK行不行,一看要下载那么多东西……烦了,就没试。最后我的做法是,打开CPP下的Build.mk,找到定义 CFLAGS 的那一行,加个 /std:c++17。文件是只读的,要去掉只读属性才能保存。再编译会变成另外的错误,报异常规范不匹配。最简单的去掉警告视为错误(搜索,去掉-WX)可以编译通过。

另外我发现它没加链接时代码生成这样的优化,暂时不知道为什么。试着开了一下,用7zz b看跑分,和不开看不出区别。