有了LLVM IR库,如何在Ubuntu上将其交叉编译到iOS、Android、Windows和Mac?

39
我已经拥有我所有依赖项以及我的库的 LLVM IR 表示形式。如何从 Linux(例如 Ubuntu)交叉编译我的库为共享对象,以便在 iOS、Android、Windows 和 Mac 平台上使用?
请提供一个单一的示例脚本,可以将任何至少有一个依赖项的示例库编译到您选择的另一个库上,并在这 4 个平台上进行编译(例如 OpenCV 或 ZeroMQ 4+)。

是的。是的,它就是。 - Shark
要为Android进行交叉编译,您可能需要使用独立工具链 - Shark
你想要一个能在所有平台上运行的单一文件吗?因为那是不可能的。 - Ben Steffan
@BenSteffan:不,我想要一个单一的文件,可以在Ubuntu(或您选择的任何Linux)上编译LLVM IR成iOS、Android、Windows和Mac的二进制文件(.dll、.dylib等)。 - DuckQueen
@DuckQueen 我明白了。那肯定是可以做到的。我会研究一下这个问题。 - Ben Steffan
@BenSteffan:你觉得呢? - DuckQueen
2个回答

21
使用 LLVM静态编译器 (llc),您可以将LLVM IR编译为特定目标三元组的对象文件。虽然目标三元组的文档不是很好,但LLVM基础设施都是开源的,因此通过在源代码中进行快速搜索,您可以找到这里
不幸的是,没有关于可以使用的离散目标三元组列表的文档。但是,如果您确切地知道要针对哪个系统进行定位,则构建三元组相当容易。从目标三元组文档中获取,您可以看到:
三元组的一般格式为<arch><sub>-<vendor>-<sys>-<abi>,其中:
  • arch=x86_64i386armthumbmips等。
  • sub = 例如在ARM上:v5v6mv7av7m等。
  • vendor = pcapplenvidiaibm等。
  • sys = nonelinuxwin32darwincuda等。
  • abi = eabignuandroidmachoelf等。
一旦确定了目标三元组,您可以使用-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上得到有关此问题的答案。

3
  1. 请提供一个示例脚本,可以将您选择的任何示例库编译到所有4个平台上。
  2. 当从Linux进行交叉编译时,是否可以在Windows上使用“-mtriple = i686-pc-windows-msvc”?
- DuckQueen

0

这个链接中,有一个变量LLVM_TARGETS_TO_BUILD,定义如下:

一个分号分隔的列表,控制将构建和链接到llc中的目标。这相当于配置脚本中的--enable-targets选项。默认列表定义为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.

1
请提供一个示例脚本,可以将您选择的任何示例库编译到所有4个平台。 - DuckQueen
据我所知,这是不可能的。 - Sagar V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接