dbry / WavPack

WavPack encode/decode library, command-line programs, and several plugins
BSD 3-Clause "New" or "Revised" License
357 stars 65 forks source link

Call to undeclared library function '_BitScanForward' with VS2022 ClanCl #184

Open eres-j opened 1 month ago

eres-j commented 1 month ago

Hi,

I use WavPack via SDL_Mixer and I recently let my project build using VS2022 ClangCl and got the following error: SDL_mixer\external\wavpack\src\read_words.c(136,30): error : call to undeclared library function '_BitScanForward' with type 'unsigned char (unsigned long *, unsigned long)'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]

Step to reproduce (in SDL_mixer\external\wavpack):

"%ProgramFiles%\CMake\bin\cmake.exe" -B build -G "Visual Studio 17 2022" -A x64 -T ClangCl
"%ProgramFiles%\CMake\bin\cmake.exe" --build "build" --config Release

Potential fix: I locally patched read_words.c by adding this at line 29

#if defined(_MSC_VER) && defined(__clang__)
#include <intrin.h>
#endif

The compiler also give some warnings which could be nice to fix as well:

SDL_mixer\external\wavpack\src\unpack_dsd.c(510,9): warning : variable 'skipped_terms' set but not used [-Wunused-but-set-variable]
SDL_mixer\external\wavpack\cli\wvtag.c(1351,37): warning : passing 'char *' to parameter of type 'const unsigned char *' converts between pointers to integer types where one is of the unique plain 'char' type and the other is not [-Wpointer-sign]
SDL_mixer\external\wavpack\cli\wvunpack.c(3347,37): warning : passing 'char *' to parameter of type 'const unsigned char *' converts between pointers to integer types where one is of the unique plain 'char' type and the other is not [-Wpointer-sign]

Let me know if you need more information :)

dbry commented 1 month ago

Thanks for letting me know about this!

On the warnings, the line numbers reported don't seem to match the code. I checked against both my repo and the SDL one. The first warning is easy enough without the exact line, but the other two aren't. For example, line 1351 of wvtag.c is blank and line 3347 of wvunpack.c has no call or pointers.

eres-j commented 1 month ago

You're welcome :)

Both last 2 warning are for this same call: int act_chars = UTF8ToWideChar (string, temp); in UTF8ToAnsi function.