Имея библиотеку LLVM IR, как перекрестно скопировать ее в iOS, Android, Windows и Mac из Ubuntu?
У меня есть представления обо всех моих зависимостях и моей библиотеке в формах LLVM IR. Как перекрестно скомпилировать мою библиотеку в общий объект для платформ iOS, Android, Windows и Mac из Linux (например, Ubuntu)?
Просьба представить один пример script, который бы скомпилировал любую библиотеку примеров с хотя бы одной зависимостью от другой библиотеки по вашему выбору на всех 4 платформах (например, OpenCV или ZeroMQ 4+).
Ответы
Ответ 1
Используя статический компилятор LLVM (llc), вы можете скомпилировать LLVM IR в объектные файлы для определенной целевой тройки. Хотя целевые троек не очень хорошо документированы, инфраструктура LLVM является открытым исходным кодом, поэтому быстрый поиск по исходному коду приведет вас к .
К сожалению, нет документации для дискретного списка возможных целевых троек, которые вы можете использовать. Однако, если вы точно знаете, в какой системе вы нацеливаетесь, создание тройки довольно просто. С помощью целевой тройной документации вы можете увидеть:
Тройка имеет общий формат <arch><sub>-<vendor>-<sys>-<abi>
, где:
-
arch
= x86_64
, i386
, arm
, thumb
, mips
и т.д. -
sub
= для ex. на ARM: v5
, v6m
, v7a
, v7m
и т.д. -
vendor
= pc
, apple
, nvidia
, ibm
и т.д. -
sys
= none
, linux
, win32
, darwin
, cuda
и т.д. -
abi
= eabi
, gnu
, android
, macho
, elf
и т.д.
Как только вы выясните, какую целевую тройку вы используете, вы указываете ее как строку, используя флаг -mtriple
. Вот несколько примеров:
- Windows:
-mtriple=i686-pc-win32-gnu
- Linux:
-mtriple=i686-pc-linux-gnu
- IOS:
-mtriple=armv7-apple-ios
- Android:
-mtriple=arm-linux-androideabi
Затем вам нужно указать, что вы хотите скомпилировать объектный файл с помощью флага типа файла:
-filetype=obj
Этого должно быть достаточно, если я правильно понял ваш вопрос.
Если вы ожидаете использовать один файл на всех платформах и операционных системах, хотя это возможно, потребуется много работы, и я не ожидал бы ответа относительно этого на stackoverflow.
Ответ 2
От эта ссылка, есть переменная LLVM_TARGETS_TO_BUILD
, и в определении говорится, что
Список с разделителями с запятой, который контролирует, какие цели будут созданы и привязаны к llc. Это эквивалентно опции --enable-targets
в настройке script. Список по умолчанию определяется как LLVM_ALL_TARGETS и может быть настроен на включение целевых объектов вне дерева. Значение по умолчанию включает в себя: AArch64, AMDGPU, ARM, BPF, Hexagon, Mips, MSP430, NVPTX, PowerPC, Sparc, SystemZ, X86, XCore.
Вы должны добавить в него X86 и ARM. вам нужно добавить поддержку для 64 и Apple
От эта ссылка
Можно перекрестно скомпилировать
Пример команды выглядит как
% 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>
Также я хотел бы поделиться эту ссылку. В нем говорится:
Основной параметр - определить целевую архитектуру. Для этого используйте -target. Если вы не укажете цель, имена CPU не будут совпадать (поскольку Clang предполагает тройку хоста), и компиляция будет продолжена, создавая код для платформы хоста, который будет разбиваться позже при сборке или компоновке.
Тройка имеет общий формат <arch><sub>-<vendor>-<sys>-<abi>
, где:
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.