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

Can static libraries that don't rely upon the C standard library be compiled on one OS, then moved to another?

我知道对于完整的程序这是不可能的,因为可执行文件格式和系统调用,但是如果你有一个文件:


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

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

编译 C 代码将其转换为本机二进制/本机映像。它特定于编译它的processor/OS(当然除非你没有使用交叉编译器)。 binary/object 不会在另一个 OS 上 运行。

只有在像 javaC# 这样的语言的情况下,您才可以在另一个 OS 和 运行 上编译(无需重建)。这是因为这些语言创建了一个托管 binary/object。此托管对象不直接在 OS 上 运行。它 运行 在虚拟机上(Java 的 JVM 和 C# 的 CLR)。

Can static libraries that don't rely upon the C standard library be compiled on one OS, then moved to another?

理论上;是的。请注意,编译器只是将主要语言(例如 C)转换为次要语言(例如,可能是特定 OS 和特定 CPU 的本机代码;但也可能是 BASIC 源代码或 Web-汇编源代码或某种可移植字节码或其他任何东西)。

唯一真正重要的是使用第二语言的人理解第二语言。

实践中;对于静态库,第二语言包括目标文件格式和调用约定; "whatever uses the secondary language understands the secondary language" 包括理解目标文件格式、理解调用约定等。通常,编译器的配置使其第二语言与编译器 运行 所在的计算机有意义的任何内容相匹配,正因为如此通常你不能在一台计算机上编译静态库并将其移动到另一台计算机(使用不同的编译器 and/or OS and/or CPU)。

但是,"typical"并不表示有必要。交叉编译器是完全可以的。

例如,您可以将 GCC(及其工具 - 链接器等)移植到 Windows 并使用您的交叉编译器创建静态库,这些编译器可用于(和 运行上)Linux;如果这样做,您可能无法使用交叉编译器(Windows 上的 运行)为其他编译器创建静态库,这些编译器也在 [=25= 上的 运行 ].