CMake构建实战:项目开发卷
上QQ阅读APP看书,第一时间看更新

1.4 构建动态库

既然静态库已经非常简单易用了,为什么还需要动态库呢?显然,静态库有它的缺点。

难以维护。如果想要修复静态库中的一个错误,我们必须重新编译(链接)所有使用该静态库的程序。

浪费空间。因为静态库的目标文件会在编译过程中被链接到最终的程序中,所以每一个链接了静态库的程序都相当于将静态库的目标代码复制了一份。如果某个静态库相当通用而被很多程序静态链接,将是对空间的巨大浪费。这里不仅是指编译后的程序文件的体积,更重要的是指程序运行时占用的内存空间。

动态库,就是为了解决静态库的维护问题和空间利用问题而产生的。动态库(dynamic library),也称为动态链接库(Dynamically-Linked Library,DLL)或共享库(shared library)[6]。与静态库不同,动态库的目标代码是在程序装载时或运行时被动态链接的,而非在编译过程中静态链接的。这样,动态库与使用动态库的程序就在编译期做到了解耦。如果想更新动态库,那么只需分发新版动态库,并让用户替换掉旧版动态库。程序运行时自然会链接新版的动态库。同时,多个程序也可以共享一个动态库,换句话说,任何程序都能够在运行时将同一个动态库的目标代码动态链接到自己的程序中执行,而且这份动态库的代码在内存中可以只装载一份。这样,空间利用效率就大大提高了。这也是动态库也称为共享库的原因。


[6]Windows中一般称为动态链接库,Linux中一般称为共享库。

Windows和Linux操作系统的动态链接机制有些差异,这也导致其构建过程会有一点不同。因此,在具体实践构建过程之前,一起先来探究一下不同环境中动态链接的原理吧!