我了解了交叉编译,并发现了许多有关如何创建交叉编译的信息,但有关如何使用它的信息却很少。
我想编译该bluez-utils-3.36
工具这个网站用我自己的编译器。我找到了交叉编译器(arm-linux-gcc-4.4.3.tgz)这个网站。我的 gcc 版本是 4.4.3,所以我认为这是正确的版本。
主机(我构建代码的机器)
Processor: Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz
OS Version: Linux 2.6.32-44 generic
目标机器:(编译文件应运行的目标)
Processor: ARM926EJ-S rev 5 (v5l)
OS Version: Linux 2.6.35.3-571
我如何使用这个新的编译器进行编译bluez-utils-3.36
?
答案1
编译器和工具链的其他部分有一个 GNU 标准命名方案:
<target triplet>-<tool name>
这目标三联体是这样的形式
<machine>-<vendor>-<operatingsystem>
工具名称是gcc
编译器的名称,或者其他工具名称,例如ld
orstrip
或ar
等等......
默认编译器,即编译本机二进制文件的编译器(不是交叉编译器),只是在gcc
没有三元组的情况下被调用。
您在问题中提到的文件内的编译器的三元组是arm-none-linux-gnueabi
(看起来像四元组,我知道,但事实就是如此)。因此,要使用它,只需调用arm-none-linux-gnueabi-gcc
而不是普通的gcc
。
如果您正在构建使用 a 的东西Makefile
,您通常可以通过运行而不是普通的Makefile
编译器来使用您想要的编译器。如果您正在构建使用 GNU脚本的东西,CC=arm-none-linux-gnueabi-gcc make
make
configure
您也可以为其指定目标三元组。
答案2
您需要的不仅仅是一个交叉编译器工具链,因为涉及从源代码中获取可执行文件的过程有更多步骤。这些步骤是
- 编译(源代码到汇编程序)
- 汇编(汇编代码到机器代码)
- 链接(机器代码中的例程和库链接在一起)
GNU 工具链的命名标准是<target>-<tool>
,例如arm-oe-linux-gnueabi-gcc
是 ARM 架构、开放嵌入式 Linux 变体的编译器,而arm-oe-linux-gnueabi-as
是同一工具链的汇编器,等等。
然而,这并不是您需要从主机中的源代码获取目标计算机的可执行文件的全部内容,您还需要链接器从主机中的目标计算机获取标头和库。这就是为什么您会遇到构建错误“无法读取符号。文件格式错误”。当然,一旦您将标头和 sysroot 以及所有内容复制到主机中,您就需要为交叉编译器设置相应的变量以找到正确的变量,而不是主机中的原始变量。
一般来说,源代码包包含一个为接受特定编译器而准备的Makefile。从之前的评论来看,我发现您使用 CC= 变量解决了这么多问题。完成所有设置后,只需更改 Makefile 的 CC 并调用make
.
因此,长话短说,您需要在主机中为目标机器构建自己的工具链,或者获取一个已经构建的工具链。
祝好运并玩得开心点!
答案3
主机是您进行交叉编译的机器。您的开发机器。
目标是ARM926EJ-S机器。
需要注意的几点:
ARM926EJ-S 是 ARMv5,确保您的交叉工具链针对正确版本的 ARM 处理器进行编译。
make 文件中要求的安装目录:
INSTALL = /usr/bin/install -c
我认为这将安装到您的主机(开发)机器上,而不是您想要的。
如果您要为嵌入式设备交叉编译此文件,则需要创建一个“workingInstall”目录来安装 bluez。然后将其添加到您的嵌入式文件系统中。 (nand、sd 卡)。