繁体   English   中英

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

[英]How does linking to OS C libraries under Windows and Linux work?

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM