c - 为什么我们必须在同一台机器上为不同的操作系统重新编译 c 源代码?

标签 c compilation

当我编译我的 c 源代码时(例如在 Linux 环境中),编译器会生成一个“机器可读”格式的文件。

  • 为什么同一文件在不同操作系统下的同一台机器上无法运行?
  • 问题出在我们“执行”这个文件的方式上吗?

最佳答案

有时它会起作用,这取决于您使用的格式和库等。例如,分配内存或创建窗口之类的事情都会调用操作系统函数。因此,您必须针对目标操作系统进行编译,并链接这些库(静态或动态)。

但是,说明本身是相同的。因此,如果您的程序不使用任何操作系统功能(没有标准或任何其他库),您可以在另一个操作系统上运行它。这里的第二个问题是可执行格式。Windows .exe 与 ELF 等非常不同。但是,只有指令的平面格式(例如 .com)适用于所有系统。


编辑:一个有趣的实验是在一个操作系统(例如 Windows)上将一些函数编译为平面格式(只是指令)。例如:

int add(int x, int y) { return x + y; }

仅将说明保存到文件中,没有任何重定位或其他暂存信息。然后,在不同的操作系统(例如 Linux)上编译一个完整的程序,它将执行如下操作:

typedef int (*PFUNC)(int, int); // pointer to a function like our add one

PFUNC p = malloc(200); // make sure you have enough space.
FILE *f = fopen("add.com", "rb");
fread(p, 200, 1, f); // Load the file contents into p
fclose(f);
int ten = p(4, 6);

为此,您还需要告诉操作系统/编译器您希望能够执行分配的内存,我不确定该怎么做,但我知道可以做到。

关于c - 为什么我们必须在同一台机器上为不同的操作系统重新编译 c 源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30574728/

相关文章:

c - 如何强制使用 '-pg' 编译的程序在仍在运行时转储其统计信息?

c++ - C/C++ : Optimization of pointers to string constants

python - Python 编译器和虚拟机如何处理 eval 表达式?

从不同目录编译相同的 c 程序会生成不同大小的目标代码

c++ - 我应该按什么顺序构建我的 C++ 静态库

C# 在内存中编译并创建内存组件类型的实例

C - 段错误(核心转储)错误

c - 堆内存分配

C 在数组中添加和搜索已解析的数据

iphone - 升级 XCode 4.0 后出现 LLVM GCC 4.2 错误