# 正文
继续整理从这个页面学到的东西:https://tldp.org/HOWTO/Program-Library-HOWTO
这一篇主要参考这俩:
https://tldp.org/HOWTO/Program-Library-HOWTO/introduction.html
https://tldp.org/HOWTO/Program-Library-HOWTO/static-libraries.html
这个资料主要讨论“库”,即program library。那什么叫“库”?就是一个包含了已编译代码的、可以被其它程序包含的文件。原文曰:A ``program library'' is simply a file containing compiled code (and data) that is to be incorporated later into a program。“库”有三种,静态库、共享库、动态库,对应的原文是static libraries,shared libraries,and dynamically loaded (DL) libraries。我还没能查到这三个词在中文资料里的规范叫法是什么,也不想查,因为感觉“静态库”、“共享库”、“动态库”已经足够清晰了,所以下文就用这三个说法了,加不加双引号反正都是这三个意思。为何要强调这一点呢,因为发现若干网文并不严格区分“共享库”与“动态库”,经常索性一个“动态库”了事,这很让人困惑的,我还专门问过文心一言(尾注1)。。算了不吐槽了,因为我自己写的也强不多点,唯一让我自我感觉良好一点的,就是我总会贴出来原始资料链接。
静态库是编译可执行文件时就被包含进去了的;共享库是程序启动时就加载;动态库是程序运行时、执行到需要库函数时候才加载。严格来说,“动态库”的库文件格式没有什么不同,因为静态库和共享库的库文件都可以作为动态库使用;不同的只限于编程时对库文件的用法。使用动态库时,编程要麻烦一些,而且,若干程序完全不需要动态库的优点;使用静态库时,一旦库升级了,就得重新编译可执行程序;当然,它们还是各有优势。
原文作者提醒了这个事情:共享库在有的地方被叫做 dynamically linked libraries,缩写也是DLL,我想这大概是中文资料里经常只说“静态库”和“动态库”的原因,想来美国人阅读某些资料可能也是和我们有一样的困惑:中文里动态库有“共享”和“动态”两个意思,英文的DLL也是如此这般,好吧,我心理平衡了一点儿。
静态库就是一个对象文件的集合,一般以.a结尾,使用ar命令创建。
静态库早于共享库出现,现在不如之前那么使用广泛了,但有时也用。
静态库有个好处就是,制作成静态库的这一部分代码可以不用总是重新编译,这样可以节省编译时间;不过现在的编译器速度都很快,所以这个优势就不那么明显了。
还有个好处就是,可以让别的用户使用库文件却无需提供源码,这对付费软件发布者很方便,但对使用者不太方便。
理论上,使用静态库比使用共享库或动态库快一点(1%-5%),但现实中这点差异无足轻重。
想把目标文件file1.o和file2.o打包成静态库mylib.a,使用命令ar rcs mylib.a file1.o file2.o就可以了。使用静态库的简单示例在《找到一个linux静态库动态库的好资料.1》里有一个,不再说了。原作者这里单独强调了一个事情,就是gcc的-l选项要放到要编译的文件后边,原文是:the -l option is a linker option, and thus needs to be placed AFTER the name of the file to be compiled),不过,文章是2003年4月写的,现在GCC(1)的man page上-l选项也没说这个,看来这已经成为历史了。
GCC(1)的man page上对-l选项的说明
要不说一下上边的那个ar(1)命令吧,因为之前项目上编静态库都是只使用rc选项,看一眼都是啥意思。它有manual page:
看来就是个类似tar的打包工具,只是常用来打包库文件。它可以使用s选项给创建的库文件加索引,链接到有索引的库文件时速度更快;有了索引,库里面的例程还可以相互调用:
c就是create归档文件的意思,和tar的-c类似:
r选项就是把.o对象文件加入到归档文件的意思:
好了就这些吧,其实原文也没说多少,呶: