37 votes

Ayant la bibliothèque LLVM IR comment la crosscompiler vers iOS, Android, Windows et Mac depuis Ubuntu ?

J'ai des représentations de toutes mes dépendances et de ma bibliothèque dans des formulaires LLVM IR. Comment compiler ma bibliothèque dans un objet partagé pour les plateformes iOS, Android, Windows et Mac à partir de Linux (Ubuntu par exemple) ?

Veuillez fournir un seul exemple script qui compilerait n'importe quelle bibliothèque d'exemple avec au moins une dépendance sur une autre bibliothèque de votre choix sur les 4 plateformes (par exemple OpenCV ou ZeroMQ 4+).

19voto

ajkhoury Points 447

Utilisation de la Compilateur statique LLVM (llc), vous pouvez compiler l'IR LLVM en fichiers objets pour une application spécifique. triple objectif . Bien que les triples cibles ne soient pas très bien documentés, l'infrastructure LLVM est entièrement open source, donc une recherche rapide dans le code source vous conduira à ici .

Malheureusement, il n'existe pas de documentation pour une liste discrète de triples cibles possibles que vous pouvez utiliser. Cependant, si vous savez exactement quel système vous ciblez, la construction d'un triple est assez facile. Tiré du triple documentation sur la cible vous pouvez voir :

Le triple a le format général suivant <arch>-<vendor>-<sys>-<abi> , où :

  • arch = x86_64 , i386 , arm , thumb , mips etc.
  • sub = par exemple sur 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.

Une fois que vous avez déterminé le triplet de cibles que vous utilisez, vous le spécifiez sous forme de chaîne en utilisant la commande -mtriple drapeau. Voici quelques exemples :

  • Les fenêtres : -mtriple=i686-pc-win32-gnu
  • Linux : -mtriple=i686-pc-linux-gnu
  • IOS : -mtriple=armv7-apple-ios
  • Android : -mtriple=arm-linux-androideabi

Ensuite, vous devez spécifier que vous voulez compiler un fichier objet en utilisant l'indicateur filetype :

-filetype=obj

Cela devrait suffire si je comprends bien votre question.

Si vous pensez utiliser un seul fichier sur toutes les plates-formes et tous les systèmes d'exploitation, c'est certes possible, mais il faudrait beaucoup de travail et je ne m'attendrais pas à une réponse à ce sujet ici sur stackoverflow.

-1voto

Sagar V Points 8632

De ce lien Il existe une variable LLVM_TARGETS_TO_BUILD et la définition dit que

Une liste délimitée par des points-virgules contrôlant les cibles qui seront construites et liées à llc. Ceci est équivalent à l'option --enable-targets dans l'option configure script. La liste par défaut est définie comme LLVM_ALL_TARGETS, et peut être définie pour inclure les cibles hors-arbre. La valeur par défaut inclut : AArch64, AMDGPU, ARM, BPF, Hexagon, Mips, MSP430, NVPTX, PowerPC, Sparc, SystemZ, X86, XCore.

Vous devriez ajouter le X86 et ARM est présent dans elle. vous devez ajouter le support pour 64 et Apple

De ce lien

Il est possible d'effectuer une compilation croisée

L'exemple de commande se présente comme suit

% 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>

Je voudrais aussi partager ce lien . Il est dit

L'option de base consiste à définir l'architecture cible. Pour cela, utilisez -target . Si vous ne spécifiez pas la cible, les noms des CPU ne correspondront pas (puisque Clang suppose le triple de l'hôte), et la compilation se poursuivra, créant du code pour la plateforme hôte, qui se brisera plus tard lors de l'assemblage ou de la liaison.

Le triple a le format général suivant <arch>-<vendor>-<sys>-<abi> où :

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X