当我将其从OSX移动到Ubuntu机器时,为什么必须重新编译我的C程序?

时间:2016-05-02 02:09:35

标签: c macos ubuntu gcc

我在Mac(OSX)上为学校构建了一堆简单的C程序。我编译了所有程序,并在我的Mac上用Makefile对它们进行了全部测试。一切都运作良好。

为明天准备作业,我决定通过SSH将所有这些文件(编译和源代码)传输到类网络(操作系统是Ubuntu)。我想确保一切按预期工作。

一旦我转移了所有内容,当我尝试使用Emacs shell运行已编译的程序时,我收到Cannot execute binary file错误。然后,一旦我通过Ubuntu机器上的SSH通过我的Makefile重新编译,它运行正常。但为什么不呢?

我知道这对你们中的一些人来说很明显,但我不知道为什么编译的C程序在我的机器上运行正常,但是即使操作系统不同,也必须在不同的机器上重新编译? / p>

以下是我的Makefile编译命令的示例:

example:    example.c
    gcc -Wall -pedantic -ansi example.c -o example

我很擅长C(显然)。这个问题Why does my program run on Ubuntu gcc but not OSX gcc?似乎很相似,但我不明白答案。

2 个答案:

答案 0 :(得分:8)

与其他提到的一样,C代码可能兼容,但Linux和OSX使用不兼容的不同二进制格式。因此,您需要重新编译才能使代码在另一个平台上运行。

Linux使用名为ELF

的二进制格式

OSX使用名为Mach-O

的二进制格式

有关更深入的解释,请参阅Is a Linux executable “compatible” with OS X?

答案 1 :(得分:3)

所以要添加Marius的非常好的解释:

实际上,他们使用相同的x86-64(amd64)调用约定(ABI),因此它们在另一个级别上兼容,比C语言更深......但它们以不同的目标文件格式打包(如Marius所述)。

另一个主要区别是链接器...所以虽然它们都实现了std C函数,但是它们位于不同的库中,因此如果它们是动态链接的,则符号位于错误的位置。