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

我有LLVM IR表单中的所有依赖关系和库。 如何交叉编译我的库,从Linux(例如Ubuntu)的iOS,Android,Windows和Mac平台的共享对象?

请提供一个示例脚本,它将编译任何示例库,并至less依赖于您select的另一个库到所有4个平台(例如OpenCV或ZeroMQ 4+)。

使用LLVM静态编译器 (llc),可以将LLVM IR编译为特定目标三元组的对象文件。 尽pipe目标三元组没有很好的logging,但是LLVM基础设施都是开源的,所以通过源代码的快速search将会引导你到这里 。

不幸的是,没有可用的目标三元组离散列表的文档。 但是,如果您确切知道您的目标系统,构build一个三元组相当容易。 从目标三重文档中 ,您可以看到:

三元组的格式为<arch><sub>-<vendor>-<sys>-<abi> ,其中:

  • arch = x86_64i386armthumbmips
  • sub =例如 在ARM上: v5v6mv7av7m
  • vendor = pcapplenvidiaibm等。
  • sys = nonelinuxwin32darwincuda
  • abi = eabignuandroid ,大eabielf

一旦找出了你使用的目标三元组,你可以使用-mtriple标志将其指定为一个string。 这里有些例子:

  • Windows: -mtriple=i686-pc-win32-gnu
  • Linux: -mtriple=i686-pc-linux-gnu
  • IOS: -mtriple=armv7-apple-ios
  • Android: -mtriple=arm-linux-androideabi

接下来,您需要指定要使用filetype标志编译一个目标文件:

 -filetype=obj 

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

如果您希望在所有平台和操作系统上使用单个文件,虽然这是可能的,但是这需要很多工作,我不希望在这里使用stackoverflow。

从这个链接 ,有一个variablesLLVM_TARGETS_TO_BUILD和定义说

以分号分隔列表来控制哪些目标将被build立并链接到llc。 这相当于configuration脚本中的--enable-targets选项。 默认列表定义为LLVM_ALL_TARGETS,可以设置为包含树外目标。 默认值包括:AArch64,AMDGPU,ARM,BPF,Hexagon,Mips,MSP430,NVPTX,PowerPC,Sparc,SystemZ,X86,XCore。

你应该添加X86和ARM是存在的。 你需要添加对64和苹果的支持

从这个链接

可以交叉编译

示例命令看起来像

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

另外我想分享这个链接 。 它说

基本的select是定义目标体系结构。 为此,请使用-target。 如果你没有指定目标,那么CPU名称将不匹配(因为Clang假定主机是三重的),并且编译将继续,为主机平台创build代码,稍后在组装或链接时会中断。

三元组的格式为<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.