Comment contourner la dépendance des en-têtes CRT Windows Universal sur vcruntime.h

En essayant d’évaluer Clang sous Windows, en utilisant Windows Universal C Run-Time (… \ Windows Kits \ 10 \ Include \ 10.0.15063.0 \ ucrt), j’étais immédiatement confronté à un mur inattendu, sous la forme d’une dépendance non divulguée et inattendue. sur Microsoft Visual Studio. Apparemment, même le programme C le plus simple ne sera pas capable de comstackr dès que vous incluez un en-tête C standard, car ils semblent tous finir par tenter d’inclure vcruntime.h (qui ne fait pas partie de l’UCRT).

Mes questions sont:

  1. Existe-t-il un moyen d’utiliser le SDK Windows Universal C RTL sans Visual Studio?
  2. Si ce n’est pas prévu ou possible, pourquoi ne s’appelle-t-il pas “Windows CRT pour Microsoft VC” – qu’est-ce qui me manque?

Check out [MSDN]: Présentation du Universal CRT (et aussi des autres URL auxquelles il fait référence):

En juin de l’année dernière, nous avons publié une paire d’articles sur les principaux changements apportés au Visual C ++ C Runtime (CRT) pour Visual Studio 2015 .

L’ AppCRT et DesktopCRT ont été regroupés dans une seule bibliothèque, appelée Universal CRT . Les nouvelles DLL sont nommées ucrtbase.dll (release) et ucrtbased.dll (debug); ils n’incluent pas de numéro de version car nous les entretiendrons sur place.

De [MSDN]: Le refactoring du grand C Runtime (CRT) (pour clarifier certains des éléments en gras ):

Afin d’unifier ces différents CRT, nous avons divisé le CRT en trois parties:

  1. VCRuntime (vcruntime140.dll) …

  2. AppCRT (appcrt140.dll) …

  3. DesktopCRT (desktopcrt140.dll) …

Selon [MS.Support]: Mise à jour pour Universal C Runtime sous Windows :

Microsoft Visual Studio 2015 crée une dépendance sur Universal CRT lorsque les applications sont créées à l’aide du Kit de développement logiciel (SDK) Windows 10 .

et à partir de [MS.Dev]: Windows 10 SDK :

Remarque : Le développement Windows 10 ciblant Windows 10, version 1803 (ou ultérieure) nécessite Visual Studio 2017 . Ce SDK ne sera pas découvert par les versions précédentes de Visual Studio.

Donc, U CRT est ssortingctement lié à VStudio . Universal : signifie qu’il ne dépend pas de la version de VStudio (toutes les versions de VStudio en utiliseront une seule ( il ne peut y en avoir qu’une seule )).

UCRT est l’équivalent Win (wannabe) de la libc de Ux .

J’ai jeté un coup d’oeil dans le répertoire SDK include dir (ex: “c: \ Program Files (x86) \ Windows Kits \ 10 \ Include \ 10.0.15063.0 \ ucrt” ):

  • Chaque fichier commun (par exemple stdio.h ) a un #include
  • corecrt.h a un #include

pas de #ifdef s, donc il n’y a pas moyen (du moins pas facile) de surmonter cela.

Mais les choses sont encore plus claires lorsque la phase de liaison est atteinte. Si votre code C inclut des en têtes UCRT , il sera probablement (le plus probablement) lié aux fichiers du répertoire SDK lib (par exemple “c: \ Program Files (x86) \ Windows Kits \ 10 \ Lib \ 10.0.15063.0 \ ucrt \ x64” ), qui sont générés par VStudio , et il y a de grandes chances que cela échoue. Exemple:

code.c :

 //#include  int main() { //printf("Dummy.... sizeof(void*): %d\n", sizeof(void*)); return 0; } 
 e:\Work\Dev\StackOverflow\q045340527>dir /b code.c e:\Work\Dev\StackOverflow\q045340527>"c:\Install\x86\Microsoft\Visual Studio Community\2015\VC\bin\cl.exe" -nologo -c -Focode.obj code.c code.c e:\Work\Dev\StackOverflow\q045340527>"c:\Install\Google\Android_SDK\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang.exe" -c -o code.o code.c e:\Work\Dev\StackOverflow\q045340527>dir /b code.c code.o code.obj 

Les 2 fichiers (générés) sont incompatibles :

 e:\Work\Dev\StackOverflow\q045340527>"C:\Install\x86\Microsoft\Visual Studio Community\2015\VC\bin\amd64\dumpbin.exe" -nologo code.obj Dump of file code.obj File Type: COFF OBJECT Summary 80 .debug$S 2F .drectve 7 .text$mn e:\Work\Dev\StackOverflow\q045340527>"C:\Install\x86\Microsoft\Visual Studio Community\2015\VC\bin\amd64\dumpbin.exe" -nologo code.o Dump of file code.o code.o : warning LNK4048: Invalid format file; ignored Summary e:\Work\Dev\StackOverflow\q045340527>"c:\Install\x64\Cygwin\Cygwin\AllVers\bin\readelf.exe" -d code.o e:\Work\Dev\StackOverflow\q045340527>"c:\Install\x64\Cygwin\Cygwin\AllVers\bin\readelf.exe" -d code.obj readelf: Error: Not an ELF file - it has the wrong magic bytes at the start 

Maintenant, je sais que lld (je me souviens que je l’ai construit dans le passé, mais je ne le trouve pas, afin de tester ma déclaration) est capable de lier les formats de fichiers ELF et COFF , mais je doute qu’il puisse combiner leur.

Conclusion

Sur la base de ce qui précède, voici les réponses à vos questions:

  1. Je suppose que c’est – un non pris en charge cependant (affirmer que quelque chose est impossible est presque toujours faux ). Mais, il y aurait beaucoup de ressortingctions (considérez la correspondance de format de fichier ci-dessus), et vous auriez probablement besoin de quelques astuces ou solutions de contournement ( gainarii ) (certaines que je peux penser):

    • La modifier (éditer ses fichiers d’en-tête – pour supprimer les #include s indésirables)
    • Création d’un fichier vcruntime.h factice (pour passer la phase de compilation)
  2. L’ajout de VStudio (ou de toute autre chose, en fait) dans le nom diminuerait automatiquement son ” niveau d’universalité .
    Et ce n’est que la première étape: il a été séparé de VC Runtime . Pensez-y comme à un bébé. Avec le temps, il deviendra mature et (plus stable) et peut-être que d’autres compilateurs / chaînes d’outils de compilation le supporteront (pas besoin de suivre les règles spartiates et de le jeter :)) au moins pas maintenant. .
    Mais je pense que seuls les États membres pourraient avoir une réponse à cette question (bien qu’il y ait de grandes chances qu’ils ne fournissent pas une réponse plus claire).

Je vis dans un pays avec une chaîne de télévision appelée Global. Pendant les 15 premières années d’existence de Globals, vous ne pouviez regarder que si vous viviez dans une ville, Toronto. Pourtant, c’était Global. Microsoft a une définition similaire de Universal.

Dans le monde réel de la programmation, il y a une meilleure définition de l’universel, elle s’appelle UNIX. Même Microsoft a été obligé de (prétendre) comprendre UNIX; et Linux comprend certainement UNIX. Vous n’avez pas à supporter les outils de développement de merde; Linux et UNIX sont disponibles partout.