c++ - 7zip 构建失败并出现 LzFind.c(1613,30):错误 C2440:void (__stdcall *)(UInt32,CLzRef *,const CLzRef *)”->“LZFIND_SATUR_SUB_CODE_FUNC
问题描述
我正在尝试7z2103-src.7z
使用 Visual Studio 2019 构建 7-zip()。
我在 vs 2019 之前打开7zip_src\Bundles\Fm\FM.dsw
并将其转换为 vcxproj。
然后为项目设置/Zi
和/Gy
构建它。
vs 2019 给出以下错误:
1>LzFind.c
1>=== LzFind SSE41
1>C:\Project\7zip-size\C\LzFind.c(1606,28): error C2440: "=": Cannot convert “void (__stdcall *)(UInt32,CLzRef *,const CLzRef *)" to "LZFIND_SATUR_SUB_CODE_FUNC"
1>=== LzFind AVX2
1>C:\Project\7zip-size\C\LzFind.c(1613,30): error C2440: "=": Cannot convert “void (__stdcall *)(UInt32,CLzRef *,const CLzRef *)" to "LZFIND_SATUR_SUB_CODE_FUNC"
但是我通过nmake(nmake CPU=AMD64 NEW_COMPILER=1 MY_STATIC_LINK=1
)构建成功,这个项目需要更多的设置吗?
一段代码在 7-zip 源代码中出现错误:
MY_NO_INLINE
static
#ifdef ATTRIB_SSE41
ATTRIB_SSE41
#endif
void LzFind_SaturSub_128(UInt32 subValue, CLzRef *items, const CLzRef *lim)
{
v128 sub2 =
#ifdef MY_CPU_ARM_OR_ARM64
vdupq_n_u32(subValue);
#else
_mm_set_epi32((Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue);
#endif
do
{
SASUB_128(0)
SASUB_128(1)
SASUB_128(2)
SASUB_128(3)
items += 4 * 4;
}
while (items != lim);
}
......
void LzFindPrepare()
{
#ifndef FORCE_SATUR_SUB_128
#ifdef USE_SATUR_SUB_128
LZFIND_SATUR_SUB_CODE_FUNC f = NULL;
#ifdef MY_CPU_ARM_OR_ARM64
{
if (CPU_IsSupported_NEON())
{
#pragma message ("=== LzFind NEON")
_PRF(printf("\n=== LzFind NEON\n"));
f = LzFind_SaturSub_128;
}
// f = 0; // for debug
}
#else // MY_CPU_ARM_OR_ARM64
if (CPU_IsSupported_SSE41())
{
#pragma message ("=== LzFind SSE41")
_PRF(printf("\n=== LzFind SSE41\n"));
f = LzFind_SaturSub_128; // <- Error occurred here
#ifdef USE_AVX2
if (CPU_IsSupported_AVX2())
{
#pragma message ("=== LzFind AVX2")
_PRF(printf("\n=== LzFind AVX2\n"));
f = LzFind_SaturSub_256; // <- Error occurred here
}
#endif
}
#endif // MY_CPU_ARM_OR_ARM64
g_LzFind_SaturSub = f;
#endif // USE_SATUR_SUB_128
#endif // FORCE_SATUR_SUB_128
}
LZFIND_SATUR_SUB_CODE_FUNC 和 LzFind_SaturSub_256 的声明:
#ifndef FORCE_SATUR_SUB_128
typedef void (MY_FAST_CALL *LZFIND_SATUR_SUB_CODE_FUNC)(
UInt32 subValue, CLzRef *items, const CLzRef *lim);
static LZFIND_SATUR_SUB_CODE_FUNC g_LzFind_SaturSub;
#endif // FORCE_SATUR_SUB_128
#ifdef ATTRIB_AVX2
ATTRIB_AVX2
#endif
void LzFind_SaturSub_256(UInt32 subValue, CLzRef *items, const CLzRef *lim)
{
__m256i sub2 = _mm256_set_epi32(
(Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue,
(Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue);
do
{
SASUB_256(0)
SASUB_256(1)
items += 2 * 8;
}
while (items != lim);
}
#endif // USE_AVX2
更新:将项目切换到 x64 构建后,错误消失并成功构建 fm.exe。
解决方案
推荐阅读
- mysql - MPTT 算法 VS 数据归一化
- vba - 如何使用vba将多列数据从一张表复制并粘贴到另一张表
- c# - 在 C# windows 应用程序中的循环内显示文本
- php - 将 localhost PHP 转换为 PDF
- apache-spark - 无法解析字段名称中的列名称
- angular6 - 以 Angular 6 反应形式预填充和验证日期
- apache-spark - spark streaming DStream map vs foreachRDD,转换效率更高
- c# - 在 Http 请求中设置标头
- amazon-web-services - 本地执行时出现内部服务器错误
- java - 关于访问孩子的变量或方法