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

时间:2010-01-19 00:54:16

标签: c operating-system linker

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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

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

从结构和填充开始,您会注意到大多数框架都使用不透明类型,即指向结构的指针。通常,结构的布局甚至不能供客户使用。因此,它们永远不会使用实际数据,只能指向数据,这样可以清除填充问题。

答案 2 :(得分:0)

标准。你会注意到stdlib的东西在原始值和数组上运行 - 而且这些东西的标准非常清楚如何完成。