我对嵌入式 linux 编程很陌生,并不太了解这个概念。
谁能解释“主机-目标”关系的本质?该模型是否仅特定于“交叉编译”?是否只是因为“可执行代码将在另一个环境中运行”而使用?目标上的linux内核有什么关系?例如,《构建嵌入式 linux 系统》一书中提到了这一点,但没有解释其进行此类开发的动机或目标。
非常感谢。
我对嵌入式 linux 编程很陌生,并不太了解这个概念。
谁能解释“主机-目标”关系的本质?该模型是否仅特定于“交叉编译”?是否只是因为“可执行代码将在另一个环境中运行”而使用?目标上的linux内核有什么关系?例如,《构建嵌入式 linux 系统》一书中提到了这一点,但没有解释其进行此类开发的动机或目标。
非常感谢。
这个模型的“动机”是嵌入式目标很少是适合开发的平台。它可能是资源受限的,没有操作系统,没有可以在目标上运行的编译器,没有用于源文件的文件系统,没有键盘或显示器,没有网络,并且可能相对较慢或您可能需要开发的其他任何东西有效地。
如果您的嵌入式系统适合运行 Linux,则可能并非所有上述限制都适用,但几乎可以肯定它们足以让您避免直接在目标上进行开发。如果不是这样,它们也许几乎不能称得上是嵌入式系统。
http://www.landley.net/writing/docs/cross-compiling.html
似乎很清楚。你有什么具体问题?
Linux 自其起源以来就是以非常可移植的方式编写的。它可以在具有不同 CPU 的各种机器上运行,并且以可移植的方式编写被认为是一件好事,因此,例如,包维护者可以轻松地将您的程序移植到某些嵌入式 ARM 或 Cygwin 或 Amiga,或者...
所以,是的,该模型“仅”特定于交叉编译,但实际上 Linux 上的每个编译都是交叉编译的(变体),只是默认情况下构建、主机和目标自动设置为相同的值,与您运行的机器相同。
尽管如此,您仍然可以使用 Linux-i386 编译的编译器、它的源代码,然后为 Linux-amd64“交叉编译”它。生成的二进制文件将在 64 位 CPU 上运行得更快。
不过,它在嵌入式编程中非常重要。主要是因为您为无法运行编译器或以蜗牛速度运行的弱 CPU 编写程序。因此,您在快速 CPU(例如,一些多核 Intel)上使用交叉编译器并为嵌入式 CPU(例如,一些低端 ARM)进行交叉编译。
“在不同的环境中”是非常温和的说法。嵌入式交叉编译时您正在做的是使用完全不同的指令集、不同的内存访问模式、不同的资源访问方法等等。与构建主机结构完全不同的机器。您的构建主机可能是运行 Cygwin 的 Windows PC。您的目标可能是智能手机内部的芯片。该二进制文件看起来与 Cygwin .exe 文件完全不同。
作为直接结果,必须从头开始为目标编译 -everything-。内核、系统实用程序、系统库以及目标必须运行的所有工具。问题是,如果目标是售票亭,那么交叉编译 Eclipse、GCC 和 Gnome 真的没有任何意义,然后在“本地”环境中开发,在售票亭的键盘上输入代码。相反,您只需交叉编译操作系统的基本要素和您的特定应用程序。您将开发环境保留在构建机器上,并在嵌入式设备上交叉编译您需要的一切。
[在实践中,你会得到一个目标的 Linux 发行版,然后编译你需要修改的任何东西]。