meaning - Clang C++ Cross Compiler-Generando ejecutables de Windows desde Mac OS X
clang windows (3)
He creado una aplicación C ++ usando Xcode en mi Mac usando el compilador Clang.
Quiero compilar mis archivos de origen para crear un ejecutable que pueda ejecutarse en una máquina con 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 para hacer que la aplicación sea de 16 bits (no lo entiendo) que no se puede ejecutar en 64 bits)
clang++ -std=c++11 -stdlib=libc++ -target i386-pc-win32 class1.cpp class2.cpp
Por alguna razón, cada vez que uso el indicador -target
me -target
un error que indica que el compilador no puede encontrar el encabezado <iostream>
pero en cualquier otro momento nunca se queja.
He intentado usar -Ipath/to/iostreamfolder/
sin embargo, esto no produce mejores resultados
¡Cualquier sugerencia seria genial! ¡Gracias!
También probé el ''-triple x86-pc-win32''
, pero recibo este clang: warning: argument unused during compilation: ''-triple x86-pc-win32''
Aquí hay instrucciones paso a paso para crear un archivo Hello World .exe usando llvm / clang en Mac OS X.
Compilación cruzada de Hello World para Windows utilizando Clang / LLVM en Mac OS X
Instale 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 de Windows 10 (VM) o en una computadora con Windows 10. Instale Visual Studio en Windows e incluya los siguientes ''Componentes individuales'' a través del instalador de Visual Studio:
- Windows Universal CRT SDK
- Windows Universal C Runtime
- Windows 10 SDK (XXXX) para UWP: C ++
- Conjunto de herramientas VC ++ 2017 vXXX (x86, x64)
- Actualización redistribuible de Visual C ++ 2017
- Compatibilidad con C ++ / CLI
Obtenga acceso a las bibliotecas y encabezados de MSVC desde su Mac.
- (Opción 1) Use su máquina virtual de Windows y cree una carpeta compartida entre el host y el 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 lvm llvm:
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
Copie hello.exe a su computadora con Windows o Windows VM y ejecútelo en PowerShell:
./hello.exe
Para crear versiones de 64 bits, cambie el destino anterior y vincúlelo a las bibliotecas x64.
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á que adaptarlos para Mac OS X y puede que tenga que compilar MinGW usted mismo.
En principio, Clang se puede usar como compilador cruzado: a diferencia de la mayoría de los compiladores, clang / LLVM incluye componentes (como el codegen, el ensamblador y el 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 plataformas de librerías y encabezados. Para generar un archivo ejecutable que funcione en Windows, necesita encabezados de Windows y las bibliotecas de Windows a las que desea enlazar, ya sea importando libs si está enlazando dinámicamente o libs estáticas para vincular estáticamente. Debería poder obtenerlos de una instalación de Visual Studio.
Muchas características de C ++, como la manipulación de nombres y la compatibilidad con RTTI, no están completas en Windows.Tendrías estos mismos problemas compilando para Windows en Windows con Clang.El soporte de Windows C ++ está bastante completo en estos días.El proyecto LLVM incluye el enlazador lld, que aparentemente está lo suficientemente avanzado como para poder hospedarse en Windows x86 y, por lo tanto, podría funcionar para usted como un enlazador multiplataforma, sin embargo, lld aún no es una parte estándar de las distribuciones de Clang. Clang en OS X aún usa el enlazador de plataforma OS X
ld
de manera predeterminada, al igual que Clang en Windows (link.exe
). Tendrá que obtener el lld y descubrir cómo vincularlo o encontrar algún otro enlazador multiplataforma.El controlador clang no está escrito como un controlador 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 de clang construye ese comando para ti, pero es posible que tengas que hacer mucho del mismo trabajo que el controlador de clang a mano. Y como Clang obtiene muchas menos pruebas en la compilación multiplataforma, es probable que encuentre más errores.Xcode no te va a ayudar con nada de esto. Puede configurar el Clang para compilar para OS X o iOS, pero tendrás que configurar manualmente las compilaciones multiplataforma para Windows.
Estoy relativamente seguro de que se podría improvisar un entorno basado en LLVM para crear un archivo de Windows "Hello, World" en OS X o Linux, pero no está del todo listo para que Xcode agregue un elemento de "Windows" a la lista de posibles plataformas de destino.
Si no es un desarrollador de compiladores, probablemente sea mejor que copie su código fuente en una máquina con Windows y construya con Visual Studio. Si usted es, o quiere ser, un desarrollador de compiladores, por supuesto, ayude a impulsar las capacidades de compilación cruzada de Clang. Creo que el proyecto del controlador universal Clang 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 un archivo .cpp.
Primero, las herramientas de desarrollo de Mac OS X vienen con "SDK" que contienen todas las bibliotecas y encabezados del sistema para un sistema operativo en particular. El desafío más grande aquí fue descubrir cómo transferir el SDK a Windows mientras se preservan todos los enlaces simbólicos en el SDK. (Por alguna razón, la creación de enlaces simbólicos en Windows requiere privilegios elevados, así 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 indicar a Clang dónde obtener todas las dependencias del sistema: -isysroot
. Esto, combinado con la -target
, era todo lo que necesitaba para decirle a Clang cómo producir archivos de objetos completos para OS X.
Para la vinculación, utilicé manualmente lld, ya que el controlador del compilador no parecía compatible con el enlace cruzado con lld. lld admite indicadores similares para determinar las bibliotecas del sistema de destino.
El paso final fue simplemente copiar el ejecutable producido en una máquina OS X, habilitar el permiso de ejecución (Windows no admite los mismos permisos de archivo, por lo que el bit de ejecución no se establece al compilar) y ejecutar el resultado.