什么是交叉编译
对交叉编译解释得较为清楚的一片博客:https://blog.csdn.net/gatieme/article/details/53021351
主机编译:与交叉编译相对的词语叫做主机编译,即在自己主机上进行程序编译。也是多数人平时最常用的一种方式。比如在window用VC++编译程序,在Linux中使用GCC编译程序。
交叉编译:Cross compiling/即在一个操作平台中生成另一个平台上可用的可执行程序,例如:在LinuxPC机(主机平台)中生成LinuxArm(目的平台)机上的程序。因为目的平台处于一些原因(资源匮乏、不具备编译条件)不能够进行程序编译,需要在主机平台中将代码编译称为目的平台上的可执行程序,再放入目的平台执行。
1、并不总需要交叉编译
因为交叉编译不方便,且受到技术限制。
2、并不能缺少交叉编译
目的平台搭建较慢;
目的平台资源受限;比如常见的ARM平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间,这种情况下,在ARM平台上进行本机编译就不太可能。
对于从一个开发主机为多个平台编译代码是非常有必要的;
想要可执行程序在目的平台运行,但在主机平台中直接编译的可执行程序并不能够在主机平台运行,因此需要交叉编译工具。我们就可以在CPU能力很强、存储空间足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。
首先对一些名词做以下约定。参考百科
宿主机/主机平台(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
目标机/目的平台(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。
交叉编译器命名/交叉工具链:完整格式是:CPU-制造厂商-操作系统,带 [] 的是可选部分,命名可参考;
交叉编译用法
- way1:项目可在cmakelist中增加交叉编译器的位置,即更改cmake默认启动本机编译器,同时链接目的平台上的软件库。
SET(CMAKE_CXX_COMPILER /opt/armgcc5.4.1/bin/arm-linux-gnueabihf-g++) - way2:将交叉编译平台打包,使用qemu-user-static挂载目的平台,在其中进行编译,比直接在目的平台编译方便。
sudo mount -t proc /proc systemname/proc
sudo mount -t sysfs /sys systemname/sys
sudo mount -o bind /dev systemname/dev
sudo mount -o bind /dev/pts systemname/dev/pts
sudo chroot systemname/