Clang C++ Cross Compiler-Generación de ejecutable de Windows desde Mac OS X


He creado una aplicación C++ usando Xcode en mi Mac usando el compilador Clang.

Quiero compilar mis archivos fuente para crear un ejecutable que se pueda ejecutar en una máquina Windows, sin embargo, no puedo hacer que Clang me genere un ejecutable.

Esto es lo que he intentado:

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

Esto crea un ejecutable sin embargo esto no se ejecuta (Windows me da un error relacionado con que la aplicación es de 16 bits-no entiendo esto - que no puede ejecutarse en 64 bits)

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

Para por alguna razón cada vez que uso la bandera -target recibo un error que indica que el compilador no puede encontrar la cabecera <iostream> sin embargo, en cualquier otro momento nunca gime.
He intentado usar -Ipath/to/iostreamfolder/ sin embargo, esto no produce mejores resultados

Cualquier sugerencia sería genial! ¡Gracias!

También he probado la bandera '-triple x86-pc-win32' sin embargo, recibo esta advertencia clang: warning: argument unused during compilation: '-triple x86-pc-win32'

Author: gavlaaaaaaaa, 2014-04-23

3 answers

Clang puede en principio ser utilizado como un compilador cruzado: a diferencia de la mayoría de los compiladores clang/LLVM incluye componentes (como el codegen, ensamblador y enlazador) para diferentes plataformas en el mismo binario.

Sin embargo, se encontrará con una serie de problemas al intentar usarlo como tal en una capacidad de producción:

  • Necesita bibliotecas de plataformas y encabezados. Para generar un ejecutable que funcione en Windows, necesita encabezados de Windows y bibliotecas de Windows a las que desea vincular, ya sea importa libs si estás enlazando dinámicamente o libs estáticas para enlazar estáticos. Usted debe ser capaz de obtener estos de una instalación de Visual Studio.

  • Muchas de las características de C++, como la compatibilidad con nombres y RTTI, no están completas en Windows. Tendrías estos mismos problemas compilando para Windows en Windows con Clang. El soporte de Windows C++ es bastante completo en estos días.

  • El proyecto LLVM incluye el enlazador lld, que aparentemente es lo suficientemente lejos como para que pueda auto host en Windows x86 y por lo tanto podría funcionar para usted como un enlazador multiplataforma, sin embargo lld todavía no es una parte estándar de las distribuciones de clang. Clang en OS X todavía utiliza el enlazador de plataforma de OS X ld de forma predeterminada, al igual que Clang en Windows (link.exe). Necesitarás obtener lld y descubrir cómo vincularte con él, o encontrar algún otro enlazador multiplataforma.

  • El controlador clang no está escrito como un controlador de compilador multiplataforma. Es probable que tenga que hacer mucho más trabajo práctico para ejecutar una compilación multiplataforma. Echa un vistazo a la salida de clang -###: el controlador clang construye ese comando para ti, pero es posible que tengas que hacer mucho del mismo trabajo que el controlador clang a mano. Y dado que clang obtiene mucho menos pruebas en la compilación multiplataforma, es probable que se encuentre con más errores.

  • Xcode no te va a ayudar con nada de esto. Puede configurar clang para compilar para OS X o iOS, pero tendrá que configurar manualmente compilaciones multiplataforma a las Ventanas.

Estoy relativamente seguro de que uno podría improvisar un entorno basado en LLVM para construir un C "Hola, Mundo" Windows exe en OS X o Linux, pero no está del todo listo para que Xcode agregue un elemento "Windows" a la lista de posibles plataformas de destino.


Si no eres un desarrollador de compiladores, probablemente sea mejor copiar tu código fuente a una máquina Windows y compilar con Visual Studio. Si usted es, o quiere ser, un desarrollador de compiladores, entonces por todos significa, ayudar a empujar las habilidades de compilación cruzada de Clang hacia adelante. Creo que el proyecto Clang universal driver es emocionante y realmente me gustaría ver que el progreso continúe.


He hecho con éxito la compilación cruzada opuesta: compilar un ejecutable de Mac OS X en Windows. Esto resultó ser bastante fácil de hacer manualmente en un programa pequeño, es decir, compilar directamente a .archivo cpp.

Primero, las herramientas de desarrollo de Mac OS X vienen con " SDK " que contienen todo el sistema bibliotecas y encabezados para un sistema operativo en particular. El mayor desafío aquí fue averiguar cómo transferir el SDK a Windows mientras se conservan todos los enlaces simbólicos en el SDK. (Por alguna razón crear enlaces simbólicos en Windows requiere privilegios elevados, por lo que después de producir un tar.gz en OS X con los enlaces simbólicos Tuve que ejecutar 7zip en Windows como administrador para expandir correctamente el archivo.)

Una vez que el SDK está disponible en Windows, hay una sola bandera para decirle a clang dónde obtener todas las dependencias del sistema: -isysroot. Esto combinado con la bandera -target era todo lo que necesitaba para decirle a clang cómo producir archivos objeto completos para OS X.

Para enlazar utilicé manualmente lld, ya que el controlador del compilador no parecía soportar el uso de enlaces cruzados con lld. lld soporta indicadores similares para determinar las bibliotecas del sistema de destino.

El paso final fue simplemente copiar el ejecutable producido a una máquina OS X, habilitando el permiso de ejecución (Windows no admite lo mismo permisos de archivo para que el bit de ejecución no se establezca al compilar) y ejecutar el resultado.

 21
Author: bames53,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-02 22:08:03

Aquí hay instrucciones paso a paso para construir un Hello World .exe usando llvm / clang en Mac OS X.

Compilación cruzada Hola Mundo para Windows usando Clang / LLVM en Mac OS X

Instala llvm con homebrew. Esto incluirá el clang y el enlazador llvm.

brew install llvm

Necesitará acceso a las bibliotecas y encabezados de Visual Studio C++, que están disponibles a través de Visual Studio 2017 en una máquina virtual (VM) con Windows 10 o en un equipo con Windows 10. Instalar Visual Studio en la ventana, y incluyen los siguientes Componentes Individuales' mediante el Instalador de Visual Studio:

  • SDK CRT Universal de Windows
  • Tiempo de ejecución de Windows Universal C
  • SDK de Windows 10 (X. X. X. X) para UWP: C++
  • VC++ 2017 VXXX toolset (x86,x64)
  • Visual C++ 2017 Redistributable Update
  • Soporte para C++/CLI

Obtenga acceso a las bibliotecas y encabezados de MSVC desde su Mac.

  • (Opción 1) Use su VM de Windows y cree una carpeta entre host e invitado.
  • (Opción 2) Cree un recurso compartido remoto en su computadora con Windows y conéctese a él desde su Mac.
  • (Opción 3) Copie las bibliotecas y los encabezados en su Mac, siguiendo los términos de licencia.

Encuentre los directorios específicos en su instalación de MSVC que corresponden a lo siguiente:

// 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"

Crea tu Hello World src:

// hello.cc

#include <cstdio>

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

  return 0;
}

Compilar y enlazar con el enlazador 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

Copiado hola.exe a sus Ventanas equipo o VM Windows y se ejecuta en PowerShell:

.\hello.exe

Para crear versiones de 64 bits, cambie el destino anterior y enlace a bibliotecas x64.

 19
Author: Erik MC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-15 19:59:30

Considere usar MinGW en Mac OS X para compilar binarios de Windows. Aquí hay instrucciones sobre cómo hacerlo en Linux: http://www.blogcompiler.com/2010/07/11/compile-for-windows-on-linux /

Tendrás que adaptarlos para Mac OS X y es posible que tengas que compilar MinGW tú mismo.

Http://www.mingw.org

 8
Author: Jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-26 17:04:30