Compiler construction 如何编译依赖外部库的程序?

Compiler construction 如何编译依赖外部库的程序?,compiler-construction,compilation,Compiler Construction,Compilation,是否每个程序都在编译的.exe或java文件中包含库的副本 那些应该在每台计算机上运行的库呢,比如opengl.dll等等?程序是如何编译的以及程序是如何链接的(库是静态链接还是动态链接的)是两个独立的问题。我将针对C族语言讨论这个问题 使用包含数据类型(结构)和函数(原型)声明的头文件对外部库编译程序。编译器可以使用这些声明来发出对外部库的调用,这些库与平台的应用程序二进制接口(ABI)有关,ABI指定了结构布局、调用约定、名称混乱等,这些都是程序和库在通信时必须一致同意的。编译完成后,编译器

是否每个程序都在编译的.exe或java文件中包含库的副本


那些应该在每台计算机上运行的库呢,比如opengl.dll等等?

程序是如何编译的以及程序是如何链接的(库是静态链接还是动态链接的)是两个独立的问题。我将针对C族语言讨论这个问题

使用包含数据类型(结构)和函数(原型)声明的头文件对外部库编译程序。编译器可以使用这些声明来发出对外部库的调用,这些库与平台的应用程序二进制接口(ABI)有关,ABI指定了结构布局、调用约定、名称混乱等,这些都是程序和库在通信时必须一致同意的。编译完成后,编译器将发出一个对象文件,其中包含对库函数的外部调用

在链接时,库可以静态链接,这意味着库代码的副本集成在可执行文件中(如果使用链接时优化,则可以执行进一步的优化)。否则,程序运行时将动态链接库;动态链接器使用可执行文件头中的重新定位信息,使用链接器加载外部库的地址修补对库的调用

动态链接依赖于库在运行时可用,但其优点是允许库独立于程序进行更新(例如,用于安全修复),只要库公开相同的函数和数据类型。动态链接也可以延迟,直到程序实际调用库中的函数,使程序能够更快地启动。

这完全取决于语言和平台。