我在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?似乎很相似,但我不明白答案。
答案 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函数,但是它们位于不同的库中,因此如果它们是动态链接的,则符号位于错误的位置。