我参与了有关Linux库的一些辩论,并想确认一些事情。
以我的理解(如果我做错了请纠正我,稍后我将编辑我的文章)在构建应用程序时有两种使用库的方式:
静态库的明显优点是它们允许整个应用程序独立运行,而动态库的优点是可以替换“ .so”文件(即:由于安全性而需要更新的情况)错误),而无需重新编译基本应用程序。
我听说有人对共享库和动态链接库(DLL)进行了区分,即使它们都是“ .so”文件。在Linux或任何其他POSIX兼容操作系统(即MINIX,UNIX,QNX等)上进行C / C ++开发时,共享库和DLL之间是否有区别?有人告诉我(到目前为止)一个关键的区别是共享对象仅在运行时使用,而DLL的共享必须首先在应用程序中使用dlopen()调用来打开。
最后,我还听到一些开发人员提到“共享档案”,据我了解,共享档案本身也是静态库,但从未被应用程序直接使用。相反,其他静态库将链接到“共享档案”,以将某些(但不是全部)功能/资源从共享档案中拉到正在构建的静态库中。
预先感谢大家的帮助。
在向我提供这些术语的上下文中,必须学习Linux的一组Windows开发人员实际上使用了错误的术语。 我试图纠正它们,但是(不正确的)语言规范卡住了。
LDOPTS+=-lmylib
mylib.so
dlopen()
dlsym()
dlopen
dlsym
LDOPTS+=-lmylibS
mylibS.a
“ DLL”和“ shared library” 之间的区别只是我当时工作的公司中的一种(懒惰,不准确的)口语(Windows开发人员被迫转移到Linux开发,并且这个术语陷入僵局),并遵循上述说明。
DLL
shared library
另外,在S“共享档案”的情况下,库名后的尾随“ ”文字只是该公司的惯例,而不是整个行业。
S
我一直认为DLL和共享对象是同一事物的不同术语-Windows将它们称为DLL,而在UNIX系统上,它们是共享对象,并且通用术语-动态链接库- 涵盖了这两个对象(甚至包括在UNIX上打开.so称为dlopen()“动态库”。
它们确实仅在应用程序启动时链接,但是您对头文件的验证概念不正确。头文件定义了用于编译使用该库的代码所需的原型,但是在链接时,链接器会在库本身内部进行查找,以确保所需的功能确实存在。链接器必须在链接时在某处找到函数体,否则会引发错误。它还在运行时执行此操作,因为正如您正确指出的那样,自程序编译以来,库本身可能已更改。这就是为什么ABI稳定性在平台库中如此重要的原因,因为ABI的改变破坏了针对旧版本编译的现有程序。
静态库只是直接从编译器中提取的目标文件包,就像在项目编译过程中要构建自己的对象库一样,因此静态库以完全相同的方式被拉入并馈送到链接器,未使用的位是以完全相同的方式掉落。