У меня проблема с использованием xxh3.h
в Widows при сборке для архитектуры ARM.
Проблема в том, что __emulu
- это внутренний макрос Windows только для x64 / x86 ( MS Docs ).
/* U64 XXH_mult32to64(U32 a, U64 b) { return (U64)a * (U64)b; } */
#ifdef _MSC_VER
# include <intrin.h>
/* MSVC doesn't do a good job with the mull detection. */
# define XXH_mult32to64 __emulu
#else
# define XXH_mult32to64(x, y) ((U64)((x) & 0xFFFFFFFF) * (U64)((y) & 0xFFFFFFFF))
#endif
Там, где он определен, проверяет только наличие _MSC_VER
перед его использованием. Было бы очень полезно, если бы это также могло проверить архитектуру. Скажите, либо не включать его в ARM, либо использовать его только на процессорах x64 / x86. Спасибо.
Хороший замечание, спасибо за уведомление @carstenskyboxlabs !
Вероятно, нам следует обеспечить, чтобы этот путь кода действовал только для x86
/ x64
, поскольку это цель, в которой определена инструкция __emulu
.
Боковое примечание: было бы здорово найти способ протестировать компиляцию Visual Studio для ARM и автоматизировать такой тест в AppveyorCI . Он бы поймал эту проблему и потенциальные будущие.
Спасибо за ответ.
Я не уверен, что никогда не использовал AppveyorCI, но знаю, что VS / MSBuild поддерживает сборки UWP ARM.
Когда я запускаю эти шаги с помощью CMake и Visual Studio 2019:
cd cmake_unofficial
mkdir build
cd build
cmake -G "Visual Studio 16 2019" -A ARM ..
cmake --build .
Я получаю такую ошибку:
xxhash.obj : error LNK2019: unresolved external symbol __emulu referenced in function XXH3_mul128_fold64 [C:\Users\steve\Do
cuments\xxHash\cmake_unofficial\build\xxhash.vcxproj]
C:\Users\steve\Documents\xxHash\cmake_unofficial\build\Debug\xxhash.dll : fatal error LNK1120: 1 unresolved externals [C:\U
sers\steve\Documents\xxHash\cmake_unofficial\build\xxhash.vcxproj]
У меня нет большого опыта работы с appveyor.yml, но, следуя существующему шаблону, я думаю, это позволит вам сгенерировать и запустить для ARM:
- if "%PLATFORM%"=="visual_arm" (
cd cmake_unofficial &&
cmake . -DCMAKE_BUILD_TYPE=Release -A ARM &&
cmake --build . --config Release
)
Спасибо @ v-strob за подсказку! Стоит попробовать !
Вероятно, это должно сработать. Он должен исправить компиляцию ARM и улучшить производительность x64
#if defined(_MSC_VER) && defined(_M_IX86)
# include <intrin.h>
# define XXH_mult32to64 __emulu
#else
# define XXH_mult32to64(x, y) ((U64)((x) & 0xFFFFFFFF) * (U64)((y) & 0xFFFFFFFF))
#endif
Исправлено в ветке dev
Самый полезный комментарий
Когда я запускаю эти шаги с помощью CMake и Visual Studio 2019:
cd cmake_unofficial
mkdir build
cd build
cmake -G "Visual Studio 16 2019" -A ARM ..
cmake --build .
Я получаю такую ошибку:
У меня нет большого опыта работы с appveyor.yml, но, следуя существующему шаблону, я думаю, это позволит вам сгенерировать и запустить для ARM: