代码之家  ›  专栏  ›  技术社区  ›  abc

如何链接到Windows和Linux下的OS C库?

  •  6
  • abc  · 技术社区  · 16 年前

    我了解Linux附带了一个C库,它实现了iso c函数和系统调用函数,并且在开发C时,这个库是需要链接的。但是,不同的C编译器不一定生成可链接的代码(例如,一个编译器可能会在函数参数中填充不同于另一个的数据结构)。当我可以使用任何编译器编译我的C时,如何链接内置的C库?静态链接和动态链接的情况有什么不同吗?

    另一方面,在Windows下,每个编译器都提供自己的标准库,这解决了部分问题,但是系统调用仍然在一组DLL中。C应用程序如何成功链接到这些DLL?不同的语言怎么样?(相同的DLL可由pre-.NET Visual Basic等使用。)

    3 回复  |  直到 16 年前
        1
  •  4
  •   C. K. Young    16 年前

    每个平台都有一些“调用约定”,每个C实现必须遵守这些约定,以便能够正确地与操作系统通信。例如,对于Windows,必须使用 stdcall 公约,而不是 cdecl .

    在Linux中,由于标准C库(和内核)是使用gcc编译的,所以任何其他Linux编译器都必须确保它们的调用约定与gcc使用的约定兼容。

        2
  •  3
  •   zneak    16 年前

    编译器确实附带了标准库的实现。只是在Linux下,假设任何编译器都遵循与编译库的gcc版本相同的约定。

    至于互操作性,它可能比您想象的要容易。已有的调用约定允许编译器生成对函数的有效调用,即使函数不是用同一个软件编译的。

    对于结构和填充,您会注意到大多数框架使用不透明类型,即指向结构的指针。通常,结构的布局甚至对客户机都不可用。因此,它们从不处理实际数据,只处理指向数据的指针,这将清除填充问题。

        3
  •  0
  •   Anon.    16 年前

    标准。您将注意到stdlib-stufacture对基元值和数组进行操作,并且对于这些操作的标准非常明确地说明了如何进行操作。