拥有LLVM IR库如何从Ubuntu将其交叉编译到iOS,Android,Windows和Mac?



我用LLVM IR形式表示了我所有的依赖项和我的库。如何将我的库从Linux(例如Ubuntu)交叉编译为iOS,Android,Windows和Mac平台的共享对象?

请提供一个示例脚本,该脚本可以将任何具有至少一个依赖项的示例库编译到您选择的另一个库到所有 4 个平台(例如 OpenCV 或 ZeroMQ 4+)。

使用 LLVM静态编译器 (llc),您可以将 LLVM IR 编译为特定目标三元组的对象文件。虽然目标三元组没有很好地记录,但LLVM基础设施都是开源的,所以快速搜索源代码将引导你到这里。

遗憾的是,没有关于您可以使用的可能的目标三元组的离散列表的文档。但是,如果您确切地知道要针对的系统,那么构建三元组就相当容易了。从目标三重文档中获取,您可以看到:

三元组具有一般格式<arch><sub>-<vendor>-<sys>-<abi>, 哪里:

  • arch=x86_64i386armthumbmips等。
  • sub= 例如在 ARM 上:v5v6mv7av7m等。
  • vendor=pcapplenvidiaibm等。
  • sys=nonelinuxwin32darwincuda等。
  • abi=eabignuandroidmachoelf等。

确定要使用的目标三元组后,使用-mtriple标志将其指定为字符串。以下是一些示例:

  • 窗户:-mtriple=i686-pc-win32-gnu
  • Linux:-mtriple=i686-pc-linux-gnu
  • IOS:-mtriple=armv7-apple-ios
  • 安卓:-mtriple=arm-linux-androideabi

接下来,您需要指定要使用文件类型标志编译对象文件:

-filetype=obj

如果我正确理解你的问题,这应该足够了。

如果您希望在所有平台和操作系统上使用单个文件,虽然这是可能的,但这需要大量工作,我不希望在堆栈溢出上得到有关此问题的答案。

从这个链接, 有一个变量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>

我也想分享这个链接。它说

基本选项是定义目标体系结构。为此,请使用 -目标 。如果不指定目标,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.

最新更新