可以将不依赖C标准库的静态库在一个OS上编译,然后转移到另一个OS?

时间:2019-03-25 19:25:15

标签: compilation linker operating-system abi object-files

我知道对于完整程序来说这是不可能的,因为可执行文件格式和syscalls,但是如果您的文件包含:


    int add(int a, int b) {
        return a + b;
    }

您能否在Linux上将其编译为目标文件或静态库,然后在macOS或Windows上使用它?

2 个答案:

答案 0 :(得分:1)

编译C代码会将其转换为本地二进制/本地映像。它特定于在其上编译的处理器/ OS(除非您当然不使用交叉编译器)。二进制文件/对象将无法在其他操作系统上运行。

仅在使用javaC#之类的语言的情况下,才可以为一个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上运行的其他编译器创建静态库。