llvm-mingw
llvm-mingw copied to clipboard
libvfw32.a missing in ARM toolchains
In trying to build AviSynth+ with the aarch64-w64-mingw32 toolchain, it can't link to libvfw32 because it wasn't built for either of the ARM toolchains. llvm-mingw built using ./build-all.sh, Ubuntu 22.04 host.
$ ninja
[2/2] Linking CXX shared library avs_core/AviSynth.dll
FAILED: avs_core/AviSynth.dll avs_core/AviSynth.dll.a
: && /usr/llvm-mingw/bin/aarch64-w64-mingw32-g++ -Wl,--enable-stdcall-fixup ../../avs_core/core/avisynth64.def -shared -o avs_core/AviSynth.dll -Wl,--out-implib,avs_core/AviSynth.dll.a -Wl,--major-image-version,0,--minor-image-version,0 avs_core/CMakeFiles/AvsCore.dir/convert/convert.cpp.obj avs_core/CMakeFiles/AvsCore.dir/convert/convert_audio.cpp.obj avs_core/CMakeFiles/AvsCore.dir/convert/convert_audio_c.cpp.obj avs_core/CMakeFiles/AvsCore.dir/convert/convert_bits.cpp.obj avs_core/CMakeFiles/AvsCore.dir/convert/convert_helper.cpp.obj avs_core/CMakeFiles/AvsCore.dir/convert/convert_matrix.cpp.obj avs_core/CMakeFiles/AvsCore.dir/convert/convert_planar.cpp.obj avs_core/CMakeFiles/AvsCore.dir/convert/convert_rgb.cpp.obj avs_core/CMakeFiles/AvsCore.dir/convert/convert_yuy2.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/AviHelper.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/BufferPool.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/DeviceManager.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/FilterConstructor.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/FilterGraph.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/MTGuard.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/PluginManager.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/Prefetcher.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/ThreadPool.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/alignplanar.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/audio.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/avisynth.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/avisynth_c.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/bitblt.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/cache.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/cpuid.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/exception.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/fonts/fixedfonts.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/info.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/initguid.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/interface.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/main.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/memcpy_amd.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/parser/expression.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/parser/script.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/parser/scriptparser.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/parser/tokenizer.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/strings.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/color.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/combine.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/conditional/conditional.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/conditional/conditional_functions.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/conditional/conditional_reader.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/convolution.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/debug.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/edit.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/exprfilter/exprfilter.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/field.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/focus.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/fps.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/greyscale.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/histogram.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/layer.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/levels.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/limiter.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/merge.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/misc.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/444convert.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_add.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_blend.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_darken.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_difference.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_exclusion.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_lighten.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_lumachroma.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_multiply.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_softhardlight.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_subtract.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/blend_common.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/overlay.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/planeswap.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/resample.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/resample_functions.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/resize.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/source.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/text-overlay.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/transform.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/turn.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/AVIIndex.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/AVIReadHandler.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/AudioSource.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/DubSource.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/FastReadStream.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/File64.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/VD_Audio.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/avi_source.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/list.cpp.obj -luuid -lwinmm -lvfw32 -lmsacm32 -lgdi32 -luser32 -ladvapi32 -lole32 -limagehlp -lpthread -lc++ && :
lld: error: unable to find library -lvfw32
clang-14: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
Obviously, in 2022 I doubt anyone is seriously using Video for Windows, and there's even less chance of VfW codecs being ported to Windows on ARM, but MSVC cross-compiles that target aarch64 build without error.
libvfw32.a is there for both i686-w64-mingw32 and x86_64-w64-mingw32, and absent for both armv7-w64-mingw32 and aarch64-w64-mingw32.
Can you provide the repository link? It'll help to ensure that the new import library is correct.
I have sent a patch in upstream mingw-w64 here https://sourceforge.net/p/mingw-w64/mailman/message/37658583/. The crt has to be rebuilt for testing.
Rebuilt llvm-mingw from a fresh clone, patch was applied through invoking git am with the above patch in build-mingw-w64.sh and then running build-all.sh as before. It was still only built for i686 and amd64, not the arm toolchains, as verified by find . | grep <library-name>. I checked mingw-w64-crt/libarm{32|64}/Makefile.am and both of those had avifil32, avicap32, and msvfw32 added to lists of libraries, so the patch was applied correctly, but still didn't build them.
After applying patches on mingw-w64, you need to run autoreconf in mingw-w64-crt.
Note that those dlls actually seem to be missing on 32 bit arm (but they exist on 64 bit arm). So even if you manage to link a binary, it wouldn’t load on 32 bit arm.
The new patch can be found here https://sourceforge.net/p/mingw-w64/mailman/message/37658696/. Martin is right. Those DLLs are not present in SysArm32 directory, neither in WinRT system images. But at first, I noticed those import libraries in Windows SDK.
I pushed that patch now, thanks!
FWIW, for similar cases in the future, you don't need to rebuild all of the toolchain just to get a missing import library. You can just run aarch64-w64-mingw32-dlltool -d path/to/avicap32.def -l toolchain/aarch64-w64-mingw32/lib/libavicap32.a. (However, as the libvfw32.a library is a merged version of three other ones, doing that requires running the .mri script for merging, e.g. cd toolchain/aarch64-w64-mingw32/lib; aarch64-w64-mingw32-ar -M < path/to/vfw32.mri.)
After applying patches on mingw-w64, you need to run autoreconf in mingw-w64-crt.
Ah, yeah. I guess I assumed that since it was cloned from git, autoreconf-ing happened somewhere in the build script. But I also just forgot to do that.
Note that those dlls actually seem to be missing on 32 bit arm (but they exist on 64 bit arm). So even if you manage to link a binary, it wouldn’t load on 32 bit arm.
At least for AviSynth+, armv7 on Windows won't really be considered a supported combination, so that's not as critically important in that particular circumstance. Are some of the Microsoft ARM devices actually only 32-bit? I could understand if someone was trying to run it on a Raspberry Pi 2 or 3, but I figure most users tinkering around with Windows on ARM are going to be using a more powerful device capable of properly handling the aarch64 version (especially going forward from now, with there being motivation to actually compete with the M1).
At least for AviSynth+, armv7 on Windows won't really be considered a supported combination, so that's not as critically important in that particular circumstance. Are some of the Microsoft ARM devices actually only 32-bit? I could understand if someone was trying to run it on a Raspberry Pi 2 or 3, but I figure most users tinkering around with Windows on ARM are going to be using a more powerful device capable of properly handling the aarch64 version (especially going forward from now, with there being motivation to actually compete with the M1).
Actual real users to worry about, no.
The original Microsoft Surface RT was 32 bit, and I've been in contact with a user who runs full unlocked desktop stuff on such a device (iirc with Windows 10 too). But that's not a properly supported platform but just a custom hack.
And I've got other users who build stuff for Win10 IoT, which iirc is 32 bit only, but that's probably not a relevant target here either.