有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_64
,i386
,arm
,thumb
,mips
等sub
=例如 在ARM上:v5
,v6m
,v7a
,v7m
等vendor
=pc
,apple
,nvidia
,ibm
等。sys
=none
,linux
,win32
,darwin
,cuda
等abi
=eabi
,gnu
,android
,大eabi
,elf
等
一旦找出了你使用的目标三元组,你可以使用-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.