Ошибка кросс-компиляции Tesseract aarch64 (arm64-v8a) этот заголовок предназначен только для x86

#c #tesseract

#c #tesseract

Вопрос:

Я пытаюсь перекрестно скомпилировать Tesseract для архитектуры arm64-v8a. Настройки архитектуры следующие.

 set(ANDROID_TOOLCHAIN_NAME aarch64-linux-android)
set(CMAKE_ANDROID_ARCH_ABI arm64-v8a)

 

Проверки компилятора работают следующим образом.

 Performing Test COMPILER_SUPPORTS_MARCH_NATIVE
Performing Test COMPILER_SUPPORTS_MARCH_NATIVE - Failed
Performing Test HAVE_AVX
Performing Test HAVE_AVX - Success
Performing Test HAVE_AVX2
Performing Test HAVE_AVX2 - Success
Performing Test HAVE_FMA
Performing Test HAVE_FMA - Success
Performing Test HAVE_SSE4_1
Performing Test HAVE_SSE4_1 - Success
Performing Test HAVE_NEON
Performing Test HAVE_NEON - Success
 

и tesseract simddetect.cpp имейте следующие макросы.

 #if defined(HAVE_AVX) || defined(HAVE_AVX2) || defined(HAVE_FMA) || defined(HAVE_SSE4_1)
#define HAS_CPUID
#endif

#if defined(HAS_CPUID)
#if defined(__GNUC__)
# include <cpuid.h>
#elif defined(_WIN32)
# include <intrin.h>
#endif
#endif

#if defined(HAVE_NEON) amp;amp; !defined(__aarch64__)
#ifdef ANDROID
#include <cpu-features.h>
#else
/* Assume linux */
#include <sys/auxv.h>
#include <asm/hwcap.h>
#endif
#endif 

SIMDDetect SIMDDetect::detector;

#if defined(__aarch64__)
// ARMv8 always has NEON.
bool SIMDDetect::neon_available_ = true;
#elif defined(HAVE_NEON)
// If true, then Neon has been detected.
bool SIMDDetect::neon_available_;
#else
// If true, then AVX has been detected.
bool SIMDDetect::avx_available_;
bool SIMDDetect::avx2_available_;
bool SIMDDetect::avx512F_available_;
bool SIMDDetect::avx512BW_available_;
// If true, then FMA has been detected.
bool SIMDDetect::fma_available_;
// If true, then SSe4.1 has been detected.
bool SIMDDetect::sse_available_;
#endif

 

ошибка компилятора

 cpuid.h:11:2#error this header is for x86 only

 

Почему tesseract включает cpuid.h если это только файл x86? как можно исправить эту ошибку?

Ответ №1:

Судя по сообщению об ошибке, проблема заключается в вашем наборе инструментов:

  1. Вы пытаетесь создать 64-битную версию arm ( arm64-v8a , aarch64-linux-android )
  2. Но ваш компилятор предоставляет только версию cpuid.h только для x86 (#ошибка этот заголовок предназначен только для x86)