我一直认为DLL和共享对象是同一事物的不同术语-Windows将它们称为DLL,而在UNIX系统上,它们是共享对象,并且通用术语-动态链接库-
涵盖了这两个对象(甚至包括在UNIX上打开.so称为
dlopen()“动态库”。
它们确实仅在应用程序启动时链接,但是您对头文件的验证概念不正确。头文件定义了用于编译使用该库的代码所需的原型,但是在链接时,链接器会在库本身内部进行查找,以确保所需的功能确实存在。链接器必须在链接时在某处找到函数体,否则会引发错误。它还在运行时执行此操作,因为正如您正确指出的那样,自程序编译以来,库本身可能已更改。这就是为什么ABI稳定性在平台库中如此重要的原因,因为ABI的改变破坏了针对旧版本编译的现有程序。
静态库只是直接从编译器中提取的目标文件包,就像在项目编译过程中要构建自己的对象库一样,因此静态库以完全相同的方式被拉入并馈送到链接器,未使用的位是以完全相同的方式掉落。



