【问题标题】:How does linking to OS C libraries under Windows and Linux work?在 Windows 和 Linux 下链接到 OS C 库是如何工作的?
【发布时间】:2010-01-19 00:54:15
【问题描述】:

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

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

【问题讨论】:

    标签: c operating-system linker


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      就互操作性而言,它可能比您想象的要容易。已建立的调用约定允许编译器生成对函数的有效调用,即使该函数不是使用相同的软件编译的。

      关于结构和填充,您会注意到大多数框架都使用不透明类型,即指向结构的指针。通常,客户甚至无法使用该结构的布局。因此,它们从不使用实际数据,只使用指向数据的指针,这解决了填充问题。

      【讨论】:

        【解决方案3】:

        标准。您会注意到 stdlib 的东西对原始值和数组进行操作 - 并且这些东西的标准非常明确地说明了如何完成。

        【讨论】:

        • 一些 ANSI C API 在结构上运行,这些结构对对齐很敏感。
        猜你喜欢
        • 2011-08-04
        • 1970-01-01
        • 2011-06-11
        • 1970-01-01
        • 1970-01-01
        • 2016-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多