tesseract-ocr / tesseract

Tesseract Open Source OCR Engine (main repository)
https://tesseract-ocr.github.io/
Apache License 2.0
61.37k stars 9.42k forks source link

tesseract failed to build error LNK2001: unresolved external symbol (EC Symbol) with MSVC on Windows arm64ec #3973

Open YangYang129 opened 1 year ago

YangYang129 commented 1 year ago

tesseract failed to build error LNK2001: 'unresolved external symbol "double __cdecl tesseract::DotProductAVX(double const ,double const ,int)" (?DotProductAVX@tesseract@@$$hYANPEBN0H@Z) (EC Symbol)' with MSVC on Windows arm64ec. It can reproduce on latest version on main branch. Could you please help look at this issue?

Repro steps:

  1. set VSCMD_SKIP_SENDTELEMETRY=1 & "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\VsDevCmd.bat" -host_arch=amd64 -arch=arm64
  2. git clone https://github.com/tesseract-ocr/tesseract F:\tesseract
  3. cd F:\tesseract
  4. git submodule update --init --recursive
  5. set PATH=F:\gitP\tesseract-ocr\tools;%PATH%
  6. sw setup
  7. mkdir build_arm64ec & cd build_arm64ec
  8. cmake -G "Visual Studio 16 2019" -A ARM64EC -DCMAKE_SYSTEM_VERSION=10.0.22618.0 -DCMAKE_BUILD_TYPE=Release -DBUILD_TRAINING_TOOLS=OFF -DINSTALL_CONFIGS=OFF -DFAST_FLOAT=OFF ..
  9. msbuild /m /p:Platform=ARM64EC /p:Configuration=Release tesseract.sln /t:Rebuild

Error info:

9>tesseract52.lib(simddetect.obj) : error LNK2001: unresolved external symbol "float __cdecl tesseract::DotProductAVX(float const *,float const *,int)" (?DotProductAVX@tesseract@@$$hYAMPEBM0H@Z) (EC Symbol) [F:\tesseract\build_arm64ec\tesseract.vcxproj]
9>tesseract52.lib(simddetect.obj) : error LNK2019: unresolved external symbol "float __cdecl tesseract::DotProductAVX(float const *,float const *,int)" (?DotProductAVX@tesseract@@YAMPEBM0H@Z) referenced in function "private: __cdecl tesseract::SIMDDetect::SIMDDetect(void)" (??0SIMDDetect@tesseract@@$$hAEAA@XZ) (EC Symbol) [F:\tesseract\build_arm64ec\tesseract.vcxproj]
 9>tesseract52.lib(simddetect.obj) : error LNK2001: unresolved external symbol "float __cdecl tesseract::DotProductAVX512F(float const *,float const *,int)" (?DotProductAVX512F@tesseract@@$$hYAMPEBM0H@Z) (EC Symbol) [F:\tesseract\build_arm64ec\tesseract.vcxproj]
9>tesseract52.lib(simddetect.obj) : error LNK2019: unresolved external symbol "float __cdecl tesseract::DotProductAVX512F(float const *,float const *,int)" (?DotProductAVX512F@tesseract@@YAMPEBM0H@Z) referenced in function "private: __cdecl tesseract::SIMDDetect::SIMDDetect(void)" (??0SIMDDetect@tesseract@@$$hAEAA@XZ) (EC Symbol) [F:\tesseract\build_arm64ec\tesseract.vcxproj]
9>tesseract52.lib(simddetect.obj) : error LNK2001: unresolved external symbol "float __cdecl tesseract::DotProductFMA(float const *,float const *,int)" (?DotProductFMA@tesseract@@$$hYAMPEBM0H@Z) (EC Symbol) [F:\tesseract\build_arm64ec\tesseract.vcxproj]
9>tesseract52.lib(simddetect.obj) : error LNK2019: unresolved external symbol "float __cdecl tesseract::DotProductFMA(float const *,float const *,int)" (?DotProductFMA@tesseract@@YAMPEBM0H@Z) referenced in function "public: static void __cdecl tesseract::SIMDDetect::Update(void)" (?Update@SIMDDetect@tesseract@@$$hSAXXZ) (EC Symbol) [F:\tesseract\build_arm64ec\tesseract.vcxproj]
9>tesseract52.lib(simddetect.obj) : error LNK2001: unresolved external symbol "float __cdecl tesseract::DotProductSSE(float const *,float const *,int)" (?DotProductSSE@tesseract@@$$hYAMPEBM0H@Z) (EC Symbol) [F:\tesseract\build_arm64ec\tesseract.vcxproj]
 9>tesseract52.lib(simddetect.obj) : error LNK2019: unresolved external symbol "float __cdecl tesseract::DotProductSSE(float const *,float const *,int)" (?DotProductSSE@tesseract@@YAMPEBM0H@Z) referenced in function "private: __cdecl tesseract::SIMDDetect::SIMDDetect(void)" (??0SIMDDetect@tesseract@@$$hAEAA@XZ) (EC Symbol) [F:\tesseract\build_arm64ec\tesseract.vcxproj]
 9>tesseract52.lib(simddetect.obj) : error LNK2019: unresolved external symbol "public: static struct tesseract::IntSimdMatrix const tesseract::IntSimdMatrix::intSimdMatrixAVX2" (?intSimdMatrixAVX2@IntSimdMatrix@tesseract@@2U12@B) referenced in function "private: __cdecl tesseract::SIMDDetect::SIMDDetect(void)" (??0SIMDDetect@tesseract@@$$hAEAA@XZ) (EC Symbol) [F:\tesseract\build_arm64ec\tesseract.vcxproj]
 9>tesseract52.lib(simddetect.obj) : error LNK2019: unresolved external symbol "public: static struct tesseract::IntSimdMatrix const tesseract::IntSimdMatrix::intSimdMatrixSSE" (?intSimdMatrixSSE@IntSimdMatrix@tesseract@@2U12@B) referenced in function "private: __cdecl tesseract::SIMDDetect::SIMDDetect(void)" (??0SIMDDetect@tesseract@@$$hAEAA@XZ) (EC Symbol) [F:\tesseract\build_arm64ec\tesseract.vcxproj]
9>F:\tesseract\build_arm64ec\bin\Release\tesseract.exe : fatal error LNK1120: 10 unresolved externals [F:\tesseract\build_arm64ec\tesseract.vcxproj]

Error log: tesseract_build.log

amitdo commented 1 year ago

CC: @egorpugin

egorpugin commented 1 year ago

Whats the status of arm64ec? Isn't it deprecated by ms because of usual arm64?

egorpugin commented 1 year ago

Well, the issue is probably somewhere in cmake.

amitdo commented 1 year ago

Whats the status of arm64ec? Isn't it deprecated by ms because of usual arm64?

https://devblogs.microsoft.com/cppblog/official-support-for-arm64ec-is-here/

zdenop commented 1 year ago

Can you try to build tesseract only with cmake? Something like this https://bucket401.blogspot.com/2021/07/crosscompile-tesseract-for-android-on.html (maybe you will need skip android related parts).

YangYang129 commented 1 year ago

@zdenop Thanks for your investigating and info. I don't open link of PNG image

I try to vcpkg install these two dependencies: Leptonica PNG, and rebuild, display following errors:

lstmboxrenderer.obj: error LNK2001: unresolved external symbol pixGetWidth (EC Symbol) [F:\tesseract\build_arm64eca\libtesseract.vcxproj]
pdfrenderer.obj : error LNK2001: unresolved external symbol pixGetWidth (EC Symbol) [F:\tesseract\build_arm64eca\libtesseract.vcxproj]
wordstrboxrenderer.obj : error LNK2001: unresolved external symbol pixGetWidth (EC Symbol) [F:\tesseract\build_arm64eca\libtesseract.vcxproj]
tordmain.obj : error LNK2001: unresolved external symbol pixGetWidth (EC Symbol) [F:\tesseract\build_arm64eca\libtesseract.vcxproj]
workingpartset.obj : error LNK2001: unresolved external symbol pixGetWidth (EC Symbol) [F:\tesseract\build_arm64eca\libtesseract.vcxproj]
baseapi.obj : error LNK2001: unresolved external symbol pixGetWidth (EC Symbol) [F:\tesseract\build_arm64eca\libtesseract.vcxproj]
hocrrenderer.obj : error LNK2001: unresolved external symbol pixGetWidth (EC Symbol) [F:\tesseract\build_arm64eca\libtesseract.vcxproj]
tablefind.obj : error LNK2001: unresolved external symbol pixGetWidth (EC Symbol) [F:\tesseract\build_arm64eca\libtesseract.vcxproj]

Repro steps:

  1. set VSCMD_SKIP_SENDTELEMETRY=1 & "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\VsDevCmd.bat" -host_arch=amd64 -arch=arm64
  2. git clone https://github.com/tesseract-ocr/tesseract F:\tesseract
  3. cd F:\vcpkg
  4. bootstrap-vcpkg.bat
  5. vcpkg.exe install --recurse Leptonica PNGPP --triplet arm64-windows --clean-after-build
  6. cd F:\tesseract
  7. git submodule update --init --recursive
  8. mkdir build_arm64eca & cd build_arm64eca
  9. cmake -G "Visual Studio 16 2019" -A ARM64EC -DCMAKE_SYSTEM_VERSION=10.0.22618.0 -DCMAKE_BUILD_TYPE=Release -DBUILD_TRAINING_TOOLS=OFF -DGRAPHICS_DISABLED=ON -DSW_BUILD=OFF -DOPENMP_BUILD=OFF -DBUILD_SHARED_LIBS=ON -DCMAKE_TOOLCHAIN_FILE=F:\vcpkg\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=arm64-windows -DINSTALL_CONFIGS=OFF -DFAST_FLOAT=OFF ..
  10. cmake --build . --config Release --target install

Error log: tesseract_rebuild_error.log

zdenop commented 1 year ago

First of all: DO NOT MIX building systems.
Next: