首页 > 解决方案 > 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。

标签: c++visual-c++7zip

解决方案


推荐阅读