7zip 构建失败,LzFind.c(1613,30):错误 C2440:void (__stdcall *)(UInt32,CLzRef *,const CLzRef *)"->"LZFIND



我正试图用visual studio 2019构建7-zip(7z2103-src.7z)。
我打开7zip_srcBundlesFmFM.dsw并将其转换为vs2019的vcxproj。
为项目设置/Zi/Gy,并进行构建。

vs 2019给出以下错误:

1>LzFind.c
1>=== LzFind SSE41
1>C:Project7zip-sizeCLzFind.c(1606,28): error C2440: "=": Cannot convert “void (__stdcall *)(UInt32,CLzRef *,const CLzRef *)" to "LZFIND_SATUR_SUB_CODE_FUNC"
1>=== LzFind AVX2
1>C:Project7zip-sizeCLzFind.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 NEONn"));
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 SSE41n"));
f = LzFind_SaturSub_128; // <- Error occurred here
#ifdef USE_AVX2
if (CPU_IsSupported_AVX2())
{
#pragma message ("=== LzFind AVX2")
_PRF(printf("n=== LzFind AVX2n"));
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 CpuArch.c项目

相关内容

  • 没有找到相关文章

最新更新