Подтвердить что ты не робот

Имея библиотеку LLVM IR, как перекрестно скопировать ее в iOS, Android, Windows и Mac из Ubuntu?

У меня есть представления обо всех моих зависимостях и моей библиотеке в формах LLVM IR. Как перекрестно скомпилировать мою библиотеку в общий объект для платформ iOS, Android, Windows и Mac из Linux (например, Ubuntu)?

Просьба представить один пример script, который бы скомпилировал любую библиотеку примеров с хотя бы одной зависимостью от другой библиотеки по вашему выбору на всех 4 платформах (например, OpenCV или ZeroMQ 4+).

4b9b3361

Ответ 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.