最佳答案
我参与了一些关于Linux中库的争论,我想确认一些事情。
这是我的理解(请纠正我,如果我错了,我会在后面编辑我的帖子),有两种方式使用库构建应用程序:
静态库的明显优势是它们允许整个应用程序是自包含的,而动态库的好处是"文件可以被替换(即:如果它需要更新由于安全漏洞),而不需要基础应用程序被重新编译。
我听说有些人在共享对象和动态链接库(DLL’s)之间做了区分,尽管它们都是“。so”。文件。在Linux或任何其他POSIX兼容的操作系统(如MINIX、UNIX、QNX等)上进行C/ c++开发时,共享对象和dll之间有什么区别吗?有人告诉我,一个关键的区别(到目前为止)是共享对象只在运行时使用,而DLL必须首先使用应用程序内的dlopen()调用打开。
最后,我还听到一些开发人员提到了“共享存档”,据我所知,它们本身也是静态库,但从未被应用程序直接使用。相反,其他静态库将链接到“共享档案”。将一些(但不是全部)函数/资源从共享存档中拉到正在构建的静态库中。
提前感谢大家的协助。
在向我提供这些术语的上下文中,这实际上是一个必须学习Linux的Windows开发人员团队使用的错误术语。我试图纠正他们,但(不正确的)语言规范仍然存在。
LDOPTS+=-lmylib
用于名为mylib.so
的库文件)。库必须在编译时和应用程序启动时存在。LDOPTS+=-lmylib
用于名为mylib.a
的库文件)。库必须在编译时存在。dlopen()
/dlsym()
命令加载的,因此在程序编译时不需要存在库。此外,库不需要在应用程序启动或编译时出现,因为它只在调用dlopen
/dlsym
时被需要。-fPIC
"旗帜。库在编译时包含在链接列表中(例如:LDOPTS+=-lmylibS
用于名为mylibS.a
的库文件)。两者之间的区别在于,如果共享对象或DLL想要静态地将共享归档链接到自己的代码中,并且能够使共享对象中的函数对其他程序可用,而不仅仅是在DLL内部使用它们,则需要这个附加标志。当有人为您提供静态库,而您希望将其重新打包为SO时,这是非常有用的。库必须在编译时存在。DLL
"和“;shared library
"这只是我当时工作的公司的一种(懒惰的,不准确的)口语化说法(Windows开发人员被迫转向Linux开发,这个术语一直存在),遵循上面提到的描述。
此外,后面的"S
"图书馆名称后面的文字,在“共享档案”的情况下;只是那家公司的惯例,而不是整个行业的惯例。