How to get xlocinfo.h for cl toolset?

34 Views Asked by At

I need to compile this C file on multiple platforms:

#include <xlocinfo.h>

int main() {
  return 0;
}

I can successfully compile this file with gcc in w64devkit:

C:/dev/scratch $ gcc -g ./main.c
C:/dev/scratch $

I guess this is because xlocinfo.h is in one of the standard search paths:

C:/dev/scratch $ echo | gcc -xc -E -v -
Using built-in specs.
COLLECT_GCC=gcc
Target: x86_64-w64-mingw32
Configured with: /gcc-13.2.0/configure --prefix=/w64devkit --with-sysroot=/w64devkit/x86_64-w64-mingw32 --with-native-system-header-dir=/include --target=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --enable-static --disable-shared --with-pic --with-gmp-include=/deps/include --with-gmp-lib=/deps/lib --with-mpc-include=/deps/include --with-mpc-lib=/deps/lib --with-mpfr-include=/deps/include --with-mpfr-lib=/deps/lib --enable-languages=c,c++ --enable-libgomp --enable-threads=posix --enable-version-specific-runtime-libs --disable-dependency-tracking --disable-multilib --disable-nls --disable-win32-registry --enable-mingw-wildcard CFLAGS_FOR_TARGET=-Os CXXFLAGS_FOR_TARGET=-Os LDFLAGS_FOR_TARGET=-s CFLAGS=-Os CXXFLAGS=-Os LDFLAGS=-s
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 13.2.0 (GCC)
COLLECT_GCC_OPTIONS='-E' '-v' '-mtune=generic' '-march=x86-64'
 C:/Program Files/w64devkit/bin/../libexec/gcc/x86_64-w64-mingw32/13.2.0/cc1.exe -E -quiet -v -iprefix C:/Program Files/w64devkit/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/ -isysroot C:/Program Files/w64devkit/bin/../x86_64-w64-mingw32 -D_REENTRANT - -mtune=generic -march=x86-64 -dumpbase -
ignoring duplicate directory "C:/Program Files/w64devkit/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/include"
ignoring nonexistent directory "C:/Program Files/w64devkit/bin/../x86_64-w64-mingw32/w64devkit/lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include"
ignoring duplicate directory "C:/Program Files/w64devkit/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed"
ignoring duplicate directory "C:/Program Files/w64devkit/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/include"
ignoring nonexistent directory "C:/Program Files/w64devkit/bin/../x86_64-w64-mingw32/mingw/include"
#include "..." search starts here:
#include <...> search starts here:
 C:/Program Files/w64devkit/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include
 C:/Program Files/w64devkit/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed
 C:/Program Files/w64devkit/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/include
End of search list.
# 0 "<stdin>"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "<stdin>"
COMPILER_PATH=C:/Program Files/w64devkit/bin/../libexec/gcc/x86_64-w64-mingw32/13.2.0/;C:/Program Files/w64devkit/bin/../libexec/gcc/
LIBRARY_PATH=C:/Program Files/w64devkit/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/;C:/Program Files/w64devkit/bin/../lib/gcc/;C:/Program Files/w64devkit/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib/;C:/Program Files/w64devkit/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/;C:/Program Files/w64devkit/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/;C:/Program Files/w64devkit/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../
COLLECT_GCC_OPTIONS='-E' '-v' '-mtune=generic' '-march=x86-64'
C:/dev/scratch $
C:/dev/scratch $ realpath "C:/Program Files/w64devkit/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/include/xlocinfo.h"
C:/Program Files/w64devkit/x86_64-w64-mingw32/include/xlocinfo.h
C:/dev/scratch $
C:/dev/scratch $ ls -l "C:/Program Files/w64devkit/x86_64-w64-mingw32/include/xlocinfo.h"
-rw-rw-r--    1 root     root          3075 Dec 07 11:19 C:/Program Files/w64devkit/x86_64-w64-mingw32/include/xlocinfo.h

I need to compile the same C program with the clang-cl toolchain in the Developer Command Prompt for Visual Studio 2022. Compilation fails because xlocinfo.h is not found:

c:\dev\scratch>clang-cl.exe main.c
main.c(1,10): fatal error: 'xlocinfo.h' file not found
#include <xlocinfo.h>
         ^~~~~~~~~~~~
1 error generated.

c:\dev\scratch>

I don't know how to query clang-cl.exe's standard include paths, but obviously there is no path included by default that includes xlocinfo.h.

I tried adding /Isystem "C:/Program Files/w64devkit/x86_64-w64-mingw32/include/xlocinfo.h" to the compiler flags, and it generated arcane errors. I'd rather not pursue this unless an answerer identifies this is okay, because this seems like an inappropriate mixing of files from different toolchains.

How can I get xlocinfo.h for the clang-cl toolchain?
Do I need to download some optional packages for Visual Studio (2022)? I did not do anything specific to include it in my installation of w64devkit -- it just seemed to be there by default.

1

There are 1 best solutions below

0
StoneThrow On

xlocinfo.h seems to get added to C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.29.30133\include when you add "MSVC v142 - VS 2019 C++ x64/x86 build tools": enter image description here

c:\dev\scratch>dir "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.29.30133\include\xlocinfo.h"
 Volume in drive C is Windows
 Volume Serial Number is 748B-8737

 Directory of C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.29.30133\include

02/07/2024  10:15 AM             5,634 xlocinfo.h
               1 File(s)          5,634 bytes
               0 Dir(s)  145,842,745,344 bytes free

c:\dev\scratch>

I think that path does not get added to %PATH%, or whatever other mechanisms clang-cl.exe uses to assign default include search paths, because clang-cl.exe main.cpp still fails unable to find xlocinfo.h, but clang-cl.exe /imsvc "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Tools/MSVC/14.29.30133/include/" main.cpp works:

c:\dev\scratch>clang-cl.exe main.cpp
main.cpp(1,10): fatal error: 'xlocinfo.h' file not found
#include <xlocinfo.h>
         ^~~~~~~~~~~~
1 error generated.

c:\dev\scratch>
c:\dev\scratch>clang-cl.exe /imsvc "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Tools/MSVC/14.29.30133/include/" main.cpp

c:\dev\scratch>

To get compilation working, I had to change my main.c to main.cpp because I guess xlocinfo.h (or something it depends on) is C++-only.