将多个目标文件(.o)打包成一个单独的文件,这样的文件被称为库。
由于目标文件中包含二进制的可执行代码和数据,因此其它目标文件可以与库进行链接,形成可执行文件。
库根据生成和链接方式不同分为静态库和动态库。
静态库的命名方式为libxxx.a,如C标准静态库libc.a,去掉lib和.a,剩下c的就是静态库名。
静态库与其它目标文件链接的方式称为静态链接。
优点:
缺点:
gcc -c将源文件编译成目标文件
ar -rc命令将目标文件整合为静态库注:可以使用ar -tv xxx查看xxx静态库包含了哪些目标文件。

静态库需要通过gcc编译器完成链接。
方法一:指明静态库的完整路径(包含库名)

方法二:指明静态库和头文件的路径(不包含库名)

其中,-I指明静态库相关头文件的路径,-L指明静态库所在路径,-l指明静态库的具体名称(去掉lib和.a)。
补充:
事实上,仅使用C官方库时,只需要使用
gcc -static选项即可完成静态链接,因为官方库和头文件都会存储在操作系统的默认路径下(头文件在**/usr/include**,库在**/lib64**)。如果想避免复杂的gcc选项,可以直接将自己的库和头文件添加到默认路径,但是一般不推荐,因为会污染系统。
动态库的命名方式为libxxx.so,如C标准动态库libc.so,去掉lib和.so,剩下的c就是动态库名。
动态库又被称为共享库,与其它目标文件链接的方式称为动态链接。
优点:
缺点:

-shared指明gcc生成动态库-fpic指明gcc生成与位置无关的代码注:
静态库的代码对应地址可以在链接时确定,但是动态库不能这样做。因为动态链接往往是运行时进行的,一旦动态库代码的地址确定,这就意味着进程需要为动态库保留这些地址,但事实上一个进程可能只使用了动态库中的一小部分代码,因此保留所有地址就是一种浪费!故而需要
-fpic选项生成与位置无关的代码,这些代码的地址在运行时才被确定,避免在链接时保留地址的情况。
方法一:指明动态库的完整路径(包含库名)

方法二:指明动态库和头文件的路径(不包含库名)

通过ldd命令即可查看当前可执行文件使用了哪些动态库:
