Clang C++ Cross compilateur-génération exécutable Windows à partir de Mac OS X

J'ai créé une application C++ en utilisant Xcode sur mon Mac en utilisant le compilateur Clang.

Je veux compiler mes fichiers source pour créer un exécutable qui peut être exécuté sur une machine windows mais je ne peux pas obtenir Clang pour me générer un exécutable.

Voici ce que j'ai essayé:

clang++ -std=c++11 -stdlib=libc++ -arch x86_64 class1.cpp class2.cpp... -o executable.exe

Cela crée un exécutable mais cela ne fonctionne pas (Windows ME donne une erreur à voir avec l'application étant 16 bits-ne comprenez pas cela - qui ne peut pas fonctionner sur 64 bits)

clang++ -std=c++11 -stdlib=libc++ -target i386-pc-win32 class1.cpp class2.cpp 

Pour une raison chaque fois que j'utilise le drapeau -target, j'obtiens une erreur indiquant que le compilateur ne peut pas trouver l'en-tête <iostream> mais n'importe quelle autre fois il ne gémit jamais.
J'ai essayé d'utiliser -Ipath/to/iostreamfolder/ mais cela ne produit pas de meilleurs résultats

Toutes les suggestions seraient géniales! Merci!

J'ai aussi essayé le '-triple x86-pc-win32' drapeau mais j'ai cet avertissement clang: warning: argument unused during compilation: '-triple x86-pc-win32'

27
demandé sur gavlaaaaaaaa 2014-04-23 19:32:40

3 réponses

Clang peut en principe être utilisé comme compilateur croisé: contrairement à la plupart des compilateurs, clang / LLVM inclut des composants (tels que le codegen, l'assembleur et l'éditeur de liens) pour différentes plates-formes dans le même binaire.

Cependant, vous rencontrerez un certain nombre de problèmes en essayant de l'utiliser comme tel dans une capacité de production:

  • Vous avez besoin de bibliothèques et d'en-têtes de plate-forme. Pour générer un exécutable qui fonctionnera sur Windows, vous avez besoin des en-têtes Windows et des bibliothèques Windows vers lesquelles vous souhaitez créer un lien importez des libs si vous liez dynamiquement ou des libs statiques pour la liaison statique. Vous devriez être en mesure de les obtenir à partir d'une installation de Visual Studio.

  • de nombreuses fonctionnalités C++ telles que la modification des noms et le support RTTI ne sont pas complètes sous Windows. Vous auriez ces mêmes problèmes de compilation Pour Windows sur Windows avec Clang. le support de Windows c++ est à peu près complet de nos jours.

  • Le projet LLVM inclut l'éditeur de liens lld, qui est apparemment assez loin pour qu'il puisse s'auto-héberger sur x86 Windows et pourrait donc fonctionner pour vous en tant que Lieur multiplateforme, mais lld n'est pas encore une partie standard des distributions clang. Clang sur OS X utilise toujours l'éditeur de liens de plate-forme OS X ld par défaut comme Clang sur Windows (link.exe). Vous devrez obtenir lld et comprendre comment créer un lien avec lui, ou trouver un autre éditeur de liens multi-plateforme.

  • Le pilote clang n'est pas écrit en tant que pilote de compilateur multiplateforme. Vous aurez probablement à faire beaucoup plus travail pratique pour exécuter une compilation multi-plateforme. Jetez un oeil à la sortie de clang -###: le pilote clang construit cette commande pour vous, mais vous devrez peut-être faire une grande partie du même travail que le pilote clang à la main. Et puisque clang obtient beaucoup moins de tests lors de la compilation multi-plateforme, vous risquez de rencontrer plus de bugs.

  • Xcode est ne va pas vous aider avec tout cela. Il peut configurer clang pour construire pour OS X ou iOS, mais vous devrez configurer manuellement les builds multiplateformes pour Windows.

Je suis relativement confiant que l'on pourrait concocter un environnement basé sur LLVM pour construire un C "Hello, World" Windows exe sur OS X ou Linux, mais il n'est pas tout à fait prêt pour Xcode d'ajouter un élément "Windows" à la liste des plates-formes cibles possibles.


Si vous n'êtes pas un développeur de compilateur, il est probablement préférable de copier votre code source sur une machine Windows et de construire avec Visual Studio. Si vous êtes, ou voulez être, un développeur de compilateur alors par tous signifie, aider à pousser les capacités de compilation croisée de Clang vers l'avant. Je pense que le Bruit pilote universel projet est passionnant et j'aimerais vraiment voir les progrès continuent.


J'ai réussi la compilation croisée inverse: compiler un exécutable Mac OS X sous Windows. Cela s'est avéré être assez facile à faire manuellement sur un petit programme, c'est-à-dire compiler directement un .fichier cpp.

Tout D'abord, les outils de développement Mac OS X sont livrés avec des " SDK " qui contiennent tout le système bibliothèques et en-têtes pour un système d'exploitation particulier. Le plus grand défi ici était de trouver comment transférer le SDK vers Windows tout en préservant tous les liens symboliques dans le SDK. (Pour une raison quelconque, la création de liens symboliques sur Windows nécessite des privilèges élevés, donc après avoir produit un tar.gz sur OS X avec les liens symboliques que j'ai dû exécuter 7zip sur Windows en tant qu'administrateur pour développer correctement l'archive.)

Une fois que le SDK est disponible sur Windows, il y a un seul indicateur pour indiquer à clang où obtenir toutes les dépendances système: -isysroot. Ceci combiné avec le drapeau -target était tout ce dont j'avais besoin pour dire à clang comment produire des fichiers objets complets pour OS X.

Pour la liaison, j'ai utilisé manuellement lld, car le pilote du compilateur ne semblait pas supporter l'utilisation de la liaison croisée avec lld. LLD prend en charge des indicateurs similaires pour déterminer les bibliothèques système cibles.

La dernière étape consistait simplement à copier l'exécutable produit sur une machine OS X, en activant l'autorisation d'exécution (Windows ne prend pas en charge la même chose les autorisations de fichier afin que le bit d'exécution ne soit pas défini lors de la construction) et de l'exécution du résultat.

21
répondu bames53 2017-03-02 22:08:03

Voici des instructions étape par étape pour construire un Hello World .exe utilisant llvm / clang sur Mac OS X.

Cross-compile Hello World Pour Windows en utilisant Clang / LLVM sur Mac OS X

Installez llvm avec homebrew. Cela inclura le Clang et l'éditeur de liens llvm.

brew install llvm

Vous aurez besoin d'accéder aux bibliothèques et aux en-têtes Visual Studio C++, qui sont disponibles via Visual Studio 2017 sur une Machine virtuelle (VM) Windows 10 ou sur un ordinateur Windows 10. Installer Visual Studio sur la fenêtre, et incluez les 'composants individuels' suivants via le programme D'installation de Visual Studio:

  • Windows Universal CRT SDK
  • Universel De Windows Runtime C
  • Windows 10 SDK (X. X. X. X) pour UWP: C++
  • VC++ 2017 vxxx toolset (x86,x64)
  • Mise À Jour Redistribuable Visual C++ 2017
  • support C++/CLI

Accédez aux bibliothèques et aux en-têtes MSVC depuis votre Mac.

  • (Option 1) Utilisez votre machine virtuelle Windows et créez un dossier entre l'hôte et l'invité.
  • (Option 2) Créez un partage distant sur votre ordinateur Windows et connectez-vous à partir de votre Mac.
  • (Option 3) Copiez les bibliothèques et les en-têtes sur votre Mac, en respectant les conditions de licence.

Trouvez les répertoires spécifiques sur votre installation MSVC qui correspondent aux éléments suivants:

// MSVC:
INCLUDES: "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\include"
LIBS: "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\lib\x86"

// C Runtime Library (CRT):
INCLUDES: "C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt"
LIBS: "C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt"

// User-Mode Library (UM):
INCLUDES: "C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\um"
LIBS: "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\um\x86"

Créez votre Hello World src:

// hello.cc

#include <cstdio>

int main(int argc, char* argv[]) {
  printf("Hello, World!\n");

  return 0;
}

Compiler et lier avec l'éditeur de liens llvm LLD:

clang -fuse-ld=lld -target i386-pc-win32 -o hello.exe hello.cc \
  -I/c/Program\ Files\ (x86)/Microsoft\ Visual\ Studio/2017/Community/VC/Tools/MSVC/14.11.25503/include \
  -I/c/Program\ Files\ (x86)/Windows\ Kits/10/Include/10.0.15063.0/ucrt \
  -L/c/Program\ Files\ (x86)/Microsoft\ Visual\ Studio/2017/Community/VC/Tools/MSVC/14.11.25503/lib/x86 \
  -L/c/Program\ Files\ (x86)/Windows\ Kits/10/Include/10.0.15063.0/ucrt \
  -L/c/Program\ Files\ (x86)/Windows\ Kits/10/Lib/10.0.15063.0/um/x86 \
  -Wno-expansion-to-defined \
  -Wno-msvc-not-found \
  -Wno-ignored-attributes \
  -D_CRT_SECURE_NO_WARNINGS

Copier bonjour.exe à votre Windows ordinateur ou machine virtuelle Windows et exécuter dans PowerShell:

.\hello.exe

Pour créer des versions 64 bits, Modifiez la cible ci-dessus et créez un lien vers les bibliothèques x64.

19
répondu Erik MC 2017-09-15 19:59:30

Pensez à utiliser MinGW sur Mac OS X pour compiler des binaires Windows. Voici des instructions sur la façon de le faire sous Linux: http://www.blogcompiler.com/2010/07/11/compile-for-windows-on-linux/

Vous devrez les adapter pour Mac OS X et vous devrez peut-être compiler MinGW vous-même.

Http://www.mingw.org

8
répondu Jason 2015-03-26 17:04:30