本文简单介绍静态链接和动态链接,它们主要的区别就是如何链接程序库。

通常我们写程序,即使是简单的hello world小程序,要链接C程序库。复杂的程序,还要链接额外的程序库。如果是静态链接,就会把程序库里面被编译程序所需要的部分拿出来,集成到最终的执行程序中,在程序运行的时候,就不再依赖系统里面部署的程序库,或者说,即使系统里面没有我们需要的程序库也没关系,程序照样运行。而动态链接则不会把程序库的内容集成到执行程序中,因此,如果程序要想成功在某个系统下运行,那么它所需要的程序库必须部署在该系统里,否则无法运行。

静态链接和动态链接各有优劣。静态链接的缺点主要有两个:浪费系统空间和升级困难。由于每一个应用程序里面都有一份程序库的拷贝,那么系统里可能就会有成千上万个程序库的拷贝,它们的存在没有意义,而且如果程序库需要升级,则每个依赖它的应用程序都需要重新编译一遍,浪费大量时间。静态链接也有好处,它使得移植程序相对容易,在开始阶段采用静态链接,可以把精力集中在应用程序本身,没有问题之后,再去考虑和系统的集成。

动态链接的优缺点正好和静态链接相对,提高系统空间利用率、升级程序库无需重新编译相关应用程序,但是应用程序对系统的依赖程度提高,有可能增大开发和移植的难度。

使用gcc,缺省情况下是动态链接,如果需要静态链接,可以使用-static参数。使用ldd或者readelf可以查看一个程序是静态链接还是动态链接,例子如下:

多谢捧场啊,我也是边学习边写,以免荒芜了小站。