gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:51:47 25 4
gpt4 key购买 nike

当我编译我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com