【发布时间】:2011-09-27 01:23:04
【问题描述】:
如果我将跨平台代码编译成目标文件,是否可以使用链接器从该单个二进制文件创建独立的平台相关可执行文件(.exe、.bin)?
编辑:似乎回答者并不真正理解我的问题。我在问你是否可以使用跨平台对象并从中生成依赖于平台的可执行文件。
【问题讨论】:
标签: c++ c linker cross-platform
如果我将跨平台代码编译成目标文件,是否可以使用链接器从该单个二进制文件创建独立的平台相关可执行文件(.exe、.bin)?
编辑:似乎回答者并不真正理解我的问题。我在问你是否可以使用跨平台对象并从中生成依赖于平台的可执行文件。
【问题讨论】:
标签: c++ c linker cross-platform
这在很大程度上完全取决于您拥有的链接器和其他开发工具。当然交叉编译在像gcc这样的高级环境中是可能的,你可以为不同的架构生成目标代码。
但是我在gcc 中从未见过将所有这些不同架构 对象打包到一个可执行文件中。
我在 Apple 平台上看到过胖二进制文件(可执行文件可以在旧的 68K Mac 或更新的 PowerPC 上运行),但我从来不是它们的忠实粉丝,Apple 完全控制那里的环境。
此外,加载程序代码(通常是操作系统的一部分)必须能够检测它应该从这样一个胖二进制文件中提取和运行哪个架构(这是 Apple 的控制派上用场的地方 - 他们可以修改他们的各种操作系统来检测和加载正确的版本)。
就个人而言,我认为您最好使用可移植语言(Java、Perl、Python 等)或将您的应用程序打包成不同的二进制文件 - 您始终可以使用优秀的跨平台安装工具包之一进行安装正确的版本。
根据您的编辑澄清问题:是的。如果 object 文件是真正跨平台的,它们将在所有这些平台上工作。因此,根据定义,您可以基于此构建特定于平台的可执行文件。请注意,这与编译某些跨平台源代码不同,因为编译过程本身很可能会将其锁定到特定平台。
同样,它取决于所使用的工具链(编译器、链接器、加载器等)。
【讨论】:
Linux 也应该支持胖二进制文件,但从未尝试过。
The FatELF page says they support static and dynamic libraries, their faq seems extensive.
【讨论】: