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

Duc*_*een 37 c++ android llvm cross-compiling ios

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

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

ajk*_*ury 19

使用LLVM静态编译器(llc),您可以将LLVM IR编译为特定目标三元组的目标文件.虽然目标三元不记录非常好,LLVM的基础设施都是开源的,所以通过源代码快速搜索将带领你在这里.

不幸的是,没有关于可以使用的可能目标三元组的离散列表的文档.但是,如果您确切知道要定位的系统,那么构建三元组相当容易.从目标三重文档中,您可以看到:

三元组具有通用格式<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,macho,elf,等.

一旦确定了正在使用的目标三元组,就可以使用该-mtriple标志将其指定为字符串.这里有些例子:

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

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

-filetype=obj
Run Code Online (Sandbox Code Playgroud)

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

如果您希望在所有平台和操作系统上使用单个文件,虽然这是可能的,但这需要大量工作,我不希望在stackoverflow上有关于此的答案.

  • 1.请提供一个示例脚本,将您所选择的(任意)示例库编译到所有4个平台.2.从Linux进行交叉编译时,可以使用`-mtriple = i686-pc-windows-msvc` for windows (3认同)