是否可以在只有一次编译的情况下在不同的操作系统上运行程序?

时间:2017-01-11 14:15:35

标签: c linux windows cross-platform

我以前不知道这个问题是否得到了回答,但我找不到任何相对的问题。

我的问题很简单。

如果有一个简单的C程序可以输出我们所在的操作系统,是否有可能在运行中 检测它并且不能重新编译它?

我们可以使用_WIN32_WIN64linux等宏,但我们必须每次在每个系统上编译代码。我们可以只使用一个编译吗?

一个简单程序的例子:

#include <stdio.h>

#ifdef _WIN32
#define OS "WINDOWS"
#endif

#ifdef linux
#define OS "LINUX"
#endif

int main(void) {
    printf("%s\n", OS);
    return 0;
}

例如,我们在linux环境中用gcc编译上面的代码。 预期的产出将取决于操作系统。

Linux: LINUX

Windows: WINDOWS

注意:

  1. 我们不想要并且不使用Gygwin
  2. 我们不使用wine

5 个答案:

答案 0 :(得分:1)

C二进制可执行文件取决于平台。 所以这是一个不。

答案 1 :(得分:1)

这是不可能的,因为两个平台上都有不同的可执行格式。 Windows使用PE格式,与Linux的ELF不兼容。

另请参阅:Has anyone been able to create a hybrid of PE COFF and ELF?

正如已经指出的那样,你需要一些兼容层,比如Wine或Cygwin。

答案 2 :(得分:0)

我想不是,因为应该有操作系统加载器的数据,因此它将知道如何在RAM中创建数据结构,并且由于不同的操作系统以不同的方式管理内存,因此答案应该是负面的。

您展示的技巧可能适用于不使用像dotnet这样的库的简单程序。 你可以让事情变得复杂并使用条件编译技巧,我不确定这是一个好主意。

答案 3 :(得分:0)

C和C ++被编译到本机二进制文件。根据定义,这意味着它们不会在多个平台上运行。不同平台的可执行文件格式不同,并且具有不同的ABI。

但是,您可以将构建系统设置为在构建时交叉编译到多个平台(这意味着您的工具链将生成所有不同的可执行文件)。

如果你要做的是弄清楚你在运行时使用的操作系统版本,也许你的操作系统有一个API。

答案 4 :(得分:0)

在一般情况下,不,它是不可能的。

但在POSIX系统上,您可以使用uname(2)

另一种选择是将宏用于您感兴趣的特定操作系统。

以下提供了可用于标识特定操作系统的宏列表: https://sourceforge.net/p/predef/wiki/OperatingSystems/

虽然此列表详尽无遗,但它可能无法涵盖现有的所有现有操作系统。但它几乎涵盖了所有专业。