compiler android c++ ios llvm cross-compiling

compiler - ¿Tienes la biblioteca de LLVM IR para compararla con iOS, Android, Windows y Mac desde Ubuntu?



llvm 6.0 1 (2)

Tengo representaciones de todas mis dependencias y mi biblioteca en formularios LLVM IR. ¿Cómo hacer una compilación cruzada de mi biblioteca en un objeto compartido para plataformas iOS, Android, Windows y Mac desde Linux (Ubuntu, por ejemplo)?

Proporcione un solo script de ejemplo que compile cualquier biblioteca de ejemplo con al menos una dependencia en otra biblioteca de su elección para las 4 plataformas (por ejemplo, OpenCV o ZeroMQ 4+).


Desde este enlace , hay una variable LLVM_TARGETS_TO_BUILD y la definición dice que

Una lista delimitada por punto y coma que controla qué objetivos se construirán y vincularán en llc. Esto es equivalente a la opción --enable-targets en el script de configuración. La lista predeterminada se define como LLVM_ALL_TARGETS, y puede configurarse para incluir objetivos fuera del árbol. El valor predeterminado incluye: AArch64, AMDGPU, ARM, BPF, Hexagon, Mips, MSP430, NVPTX, PowerPC, Sparc, SystemZ, X86, XCore.

Debería agregar el X86 y ARM está presente en él. necesita agregar soporte para 64 y Apple

De este enlace

Es posible realizar una compilación cruzada

El comando de ejemplo se ve como

% cmake -G "Ninja" -DCMAKE_OSX_ARCHITECTURES="armv7;armv7s;arm64" -DCMAKE_TOOLCHAIN_FILE=<PATH_TO_LLVM>/cmake/platforms/iOS.cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_BUILD_RUNTIME=Off -DLLVM_INCLUDE_TESTS=Off -DLLVM_INCLUDE_EXAMPLES=Off -DLLVM_ENABLE_BACKTRACES=Off [options] <PATH_TO_LLVM>

También me gustaría compartir este enlace . Dice

La opción básica es definir la arquitectura de destino. Para eso, usa -target. Si no especifica el destino, los nombres de CPU no coincidirán (ya que Clang asume el host triple), y la compilación continuará, creando código para la plataforma de host, que se romperá más adelante al ensamblar o enlazar.

El triple tiene el formato general <arch><sub>-<vendor>-<sys>-<abi> , donde:

arch = x86_64, i386, arm, thumb, mips, etc. sub = for ex. on ARM: v5, v6m, v7a, v7m, etc. vendor = pc, apple, nvidia, ibm, etc. sys = none, linux, win32, darwin, cuda, etc. abi = eabi, gnu, android, macho, elf, etc.


Utilizando el compilador estático de LLVM (llc), puede compilar el LLVM IR en archivos de objetos para un objetivo objetivo triple . Aunque los triples objetivo no están documentados muy bien, la infraestructura LLVM es todo de código abierto, por lo que una búsqueda rápida a través del código fuente lo llevará hasta here .

Lamentablemente, no hay documentación para una lista discreta de posibles tripletas objetivo que puede usar. Sin embargo, si sabes exactamente a qué sistema te diriges, construir un triple es bastante fácil. Tomado de la documentación triple objetivo , puede ver:

El triple tiene el formato general <arch><sub>-<vendor>-<sys>-<abi> , donde:

  • arch = x86_64 , i386 , arm , thumb , mips , etc.
  • sub = por ej. en ARM: v5 , v6m , v7a , v7m , etc.
  • vendor = pc , apple , nvidia , ibm , etc.
  • sys = none , linux , win32 , darwin , cuda , etc.
  • abi = eabi , gnu , android , macho , elf , etc.

Una vez que -mtriple qué objetivo de triple estás usando, lo especificas como una cadena usando el indicador -mtriple . Aquí hay unos ejemplos:

  • Windows: -mtriple=i686-pc-win32-gnu
  • Linux: -mtriple=i686-pc-linux-gnu
  • IOS: -mtriple=armv7-apple-ios
  • Android: -mtriple=arm-linux-androideabi

A continuación, debe especificar que desea compilar un archivo de objeto utilizando el indicador de tipo de archivo:

-filetype=obj

Esto debería ser suficiente si entiendo tu pregunta correctamente.

Si está esperando usar un solo archivo en todas las plataformas y sistemas operativos, aunque esto es posible, tomaría mucho trabajo y no esperaría una respuesta con respecto a eso aquí en .