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

时间:2013-07-01 02:22:55

标签: compiler-construction compilation

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

应该在每台计算机上的库,比如opengl.dll等?

1 个答案:

答案 0 :(得分:1)

如何编译程序及其链接方式(库是静态链接还是动态链接)是两个独立的问题。我将为C系列语言讨论这个问题。

使用包含数据类型(结构)和函数(原型)声明的头文件,针对外部库编译程序。编译器可以使用这些声明来发出对外部库的调用,这些外部库遵循平台的应用程序二进制接口(ABI),它指定了结构布局,调用约定,名称修改等 - 程序和库必须同意的事情沟通。编译完成后,编译器会发出一个包含对库函数的外部调用的目标文件。

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

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