在Windows和Linux下如何链接操作系统的C库?

6
我理解Linux附带一个C库,其中实现了ISO C函数和系统调用函数,这个库可以在开发C时进行链接。然而,不同的C编译器并不一定会产生可链接的代码(例如,一个编译器可能会以与另一个编译器不同的方式填充用于函数参数的数据结构)。当我可以使用任何编译器来编译我的C时,内置的C库应该如何链接?对于静态链接和动态链接,情况是否有所不同?
另一方面,在Windows下,每个编译器都提供自己的标准库,这解决了部分问题,但系统调用仍在单个DLL中。如何成功地将C应用程序链接到这些DLL?不同的语言呢?(相同的DLL可以被预.Net Visual Basic等使用。)
3个回答

4
每个平台都有一些“调用约定”,每个C实现必须遵循这些约定,以便能够正确地与操作系统通信。例如,在Windows中,所有基于操作系统的函数都必须使用stdcall约定进行调用,而不是默认的C约定cdecl
在Linux中,由于标准C库(和内核)是使用GCC编译的,因此任何其他针对Linux的编译器都必须确保它们的调用约定与GCC使用的约定兼容。

3

编译器确实会随附其标准库的实现。只是在Linux下,任何编译器都会假定编译库的GCC版本遵循相同的规范。

至于互操作性,它可能比您想象的要简单。有既定的调用约定,即使函数没有使用相同的软件编译,编译器也可以生成有效的函数调用。

关于结构和填充,您会注意到大多数框架使用不透明类型,即结构体指针。通常,客户端甚至无法访问结构体的布局。因此,他们永远不会直接处理实际数据,而只处理指向数据的指针,这消除了填充问题。


0

标准。您将注意到stdlib的内容是基于原始值和数组进行操作的 - 对于这些内容的标准非常明确,规定了如何完成任务。


1
一些 ANSI C API 操作结构体,这些结构体对齐方式很敏感。 - Alex B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接