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