我以前不知道这个问题是否得到了回答,但我找不到任何相对的问题。
我的问题很简单。
如果有一个简单的C程序可以输出我们所在的操作系统,是否有可能在运行中 检测它并且不能重新编译它?
我们可以使用_WIN32
,_WIN64
,linux
等宏,但我们必须每次在每个系统上编译代码。我们可以只使用一个编译吗?
一个简单程序的例子:
#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
答案 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/
虽然此列表详尽无遗,但它可能无法涵盖现有的所有现有操作系统。但它几乎涵盖了所有专业。