我知道对于完整程序来说这是不可能的,因为可执行文件格式和syscalls,但是如果您的文件包含:
int add(int a, int b) { return a + b; }
您能否在Linux上将其编译为目标文件或静态库,然后在macOS或Windows上使用它?
答案 0 :(得分:1)
编译C
代码会将其转换为本地二进制/本地映像。它特定于在其上编译的处理器/ OS(除非您当然不使用交叉编译器)。二进制文件/对象将无法在其他操作系统上运行。
仅在使用java
,C#
之类的语言的情况下,才可以为一个OS编译并在其他OS上运行(无需重建)。这是因为这些语言创建了托管二进制文件/对象。此托管对象不能直接在OS上运行。它在虚拟机(Java
的JVM和C#
的CLR)上运行。
答案 1 :(得分:0)
不依赖C标准库的静态库可以在一个OS上编译然后移至另一个OS吗?
理论上;是。请注意,编译器只是将主要语言(例如C)转换为次要语言(例如,可能用于特定OS和特定CPU的本机代码;但也可能是BASIC源代码或Web汇编源代码或某种可移植性)的东西。字节码或其他任何内容。
真正重要的是,无论使用辅助语言还是能理解辅助语言。
在实践中;对于静态库,辅助语言包括目标文件格式和调用约定之类的内容; “使用第二语言的任何人都可以理解第二语言”包括理解目标文件格式,理解调用约定等。通常,对编译器进行配置,以使它们的第二语言与运行编译器的计算机相匹配。通常,您无法在一台计算机上编译静态库并将其移动到另一台计算机(具有不同的编译器和/或OS和/或CPU)。
但是,“典型”并不表示必要。交叉编译器是完全可能的。
例如,您可以将GCC(及其工具-链接器等)移植到Windows,然后使用交叉编译器创建静态库,这些库可以供编译器为Linux设计(并在Linux上运行)使用。如果这样做,您可能将无法使用交叉编译器(在Windows上运行)为也正在Windows上运行的其他编译器创建静态库。