背景
首先我并不是搞什么嵌入式开发的,之所以会涉及到“交叉编译(ross-compilation)”是因为,最近在搞 OPenVINO 的 ARM 插件,试了很多次总是编译报错,于是采用了交叉编译的方式进行。如果你和我一样刚开始接触这个概念,那我就简单的把我所理解的交叉编译和大家说一下,如果有不对的地方,还请大佬们多多指教。
概念
交叉编译器(Cross compiler)是指一个在某个系统平台下可以产生另一个系统平台的可执行文件的编译器。交叉编译器在目标系统平台难以或不容易编译时非常有用。就像我这次遇到的问题,在树莓派上遇到各种问题,于是想在其他平台(Ubuntu)上进行。
这里的 ubuntu 不一定要是一个真实的操作环境,使用 Docker 也是 OK 的。
使用流程
交叉编译器的基本用法就是将构建环境(Docker)与目标环境(树莓派)分开。
常在下面几种情况中使用:
- 嵌入式电脑。这种设备的资源有限,举例来说:微波炉有一个非常小的计算机来读取其触摸板和门传感器,并向数字显示器和扬声器提供输出,以控制用于烹饪食物。这台计算机不足以运行编译器,文件系统或开发环境,因为调试和测试需要更多的嵌入式系统资源,使得在目标机上编译变得更不可能。采用交叉编译,在资源足够的机器上完成构建工作,就可以解决这个问题。
- 编译多个目标库。举个例子,一个公司可能希望支持不同版本或不同种类的操作系统,有了交叉编译,便可以为每个目标设置一个编译环境进行编译。如:在 Windows 中为底层构造完全不同的 Linux 编译程序;在电脑上为移动端操作系统构建程序。
- 在服务器上编译。类似于在多个机器进行编译,一个复杂的编译可能会涉及到许多的编译操作,可以将这些编译操作放到空闲的机器上执行,无论其底层硬件或其运行的操作系统版本如何。
- 引导一个新平台(Bootstrapping)。在为新平台开发软件,或者开发/使用未来平台的仿真器时,则使用交叉编译器来编译必要的工具,如操作系统和本机编译器。
引自维基百科:https://zh.wikipedia.org/wiki/交叉編譯器
结束语
截至到文字写完,我还没有完成 ARM 插件的编译,等我这边实验成功后,和大家分享一下经验,敬请期待。
我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!