为什么不能跨平台移动对象(.obj)文件?

时间:2015-07-18 10:25:30

标签: c++ c

为什么我们不能在OS平台上从c编译中移动.obj文件并使用它来构建最终的可执行文件?

如果我们可以这样做,我们可以将C称为独立于平台的语言,如Java吗?

4 个答案:

答案 0 :(得分:6)

C语言 平台无关。

编译器生成的文件,对象和可执行文件,取决于平台。这是因为编译器的最终目标是为目标体系结构生成可执行文件,而不是为每个已知体系结构生成。

Java 文件是独立于平台的,因为Sun是唯一的Java设计者,它实际上制定了所有规则(从字节码到文件格式和VM行为),其他人都必须适应。

原生二进制格式不会发生这种情况,每个操作系统都有格式化,编译器制作了对象格式,每个CPU都有自己的ISA。

答案 1 :(得分:3)

任何规范中都没有任何内容表明情况并非如此。 (请注意,C和C ++语言都是独立于平台的,但C和C ++生成的OBJECT文件与非平台无关)

但是,由于C和C ++都是为性能而设计的语言,因此大多数编译器都会为目标系统生成机器代码。然后你可以说“但我的Linux机器与我的Windows机器运行在同一个处理器上”,但当然,这不是目标文件或不同操作系统架构上的可执行文件之间的唯一区别。虽然有可能将包含同一处理器的机器代码的目标文件从一种格式转换为另一种格式,但它充满了诸如“内联系统调用的内容”之类的问题(换句话说,有人称之为gettimeofday std::chrono接口,编译器内联这个调用,这是一个直接调用操作系统 - 好吧,Windows不知道gettimeofday是什么,它叫做GetSystemTime或者其他一些,以及调用操作系统的方法完全不同......)

如果你想要一个独立于操作系统的系统,那么所有目标文件必须是“纯粹的” - 当然,两个系统都需要支持相同的目标文件格式(或支持它们的转换)。

可以创建一个C或C ++编译器来完成Java(和C#等)所做的事情,编译器不会为目标系统生成机器代码,但会生成“中间形式” - 但这将是与C和C ++的想法有点相反,即该语言设计得非常高效,并且没有很多开销。如果可移植性比性能更重要,那么您是否想要使用Java?或者其他一些便携式语言......

答案 2 :(得分:0)

不同的平台使用不同的目标文件格式(适用于Linux的ELF,适用于Windows的COFF / PE),因此在一个平台上构建的目标文件可能无法在另一个平台上使用。

请记住,目标文件(通常)是本机机器代码,而不是可执行形式。

答案 3 :(得分:0)

C是源代码级别的跨平台。

编译完成后,二进制文件会受到许多因素的影响。

在体系结构级别,可以生成像LLVM这样的中间对象代码,并在目标机器上执行JIT,以便代码适合目标体系结构。

但是,除非您正在进行独立开发,否则平台依赖性可能会阻止您直接运行代码。这些依赖关系可能包括链接参数,标准库的实现差异,平台特定的功能等。

仍有异常,如果操作系统提供二进制级兼容性(如BSD),您可能确实直接运行为其他平台编译的代码。