6. 使用外部库
  在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统及库函数调用的声明。库文件是一些预先编译好的函数集合,那些函数都是按照可重用原则编写的。它们通常由一组互相关联的可重用原则编写的,它们通常由一组互相关联的用来完成某项常见工作的函数构成。使用库的优点在于:
  模块化的开发
  可重用性
  可维护性
  库又可以分为静态库与动态库:
  静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。静态库比较占用磁盘空间,而且程序不可以共享静态库。运行时也是比较占内存的,因为每个程序都包含了一份静态库。
  动态库(.so或.sa):程序在运行的时候才去链接共享库的代码,多个程序共享使用库的代码,这样减少了程序的体积。
  一般头文件或库文件的位置在:
  /usr/include及其子目录底下的include文件夹
  /usr/local/include及其子目录底下的include文件夹
  /usr/lib
  /usr/local/lib
  /lib
  7. 生成静态库
  为了生成.a文件,我们需要先生成.o文件。下面这行命令将我们的hello.o打包成静态库libhello.a:
  ar rcs libhello.a hello.o
  ar是gun归档工具,rcs表示replace and create,如果libhello之前存在,将创建新的libhello.a并将其替换。
  然后可以这样来使用静态库libhello.a
  gcc -Wall main.c libhello.a -o main
  还有另外一种使用方式:
  gcc -Wall -L. main.c -o main -lhello 【lhello 是 libhello的缩写】
  其中 -L.表示库文件的位置在当前目录下,由于libhello.a是我们自己生成的,并存放在当前录下下,所以需要加上-L.选项。默认库文件是在系统的目录下进行搜索。同样的,-I.选项用于头文件的搜索。
  8. 生成共享库
  生成一个共享库,名称的规则是libxxx.so。将刚才hello.o生成libhello.so的命令为:
  gcc -shared -fPIC hello.o -o libhello.so
  生成了共享库之后,可以这样来使用共享库:
  gcc -Wall main.o -o main -L. -lhello
  该命令与使用静态库的命令相同,但是在共享库与静态库共存的情况下,优先使用共享库。
  共享库有时候并不不在当前的目录下,为了让gcc能够找得到共享库,有下面几种方法:
  拷贝.so文件到系统共享库路径下,一般指/usr/lib
  在~/.bash_profile文件中,配置LD_LIBRARY_PATH变量
  配置/etc/ld.so.conf,配置完成后调用ldconfig更新ld.so.cache
  其中,shared选项表示生成共享库格式。fPIC表示产生位置无关码(position independent code),位置无关码表示它的运行、加载与内存位置无关,可以在任何内存地址进行加载。
  9. 库的搜索路径
  库的搜索路径遵循几个搜索原则:从左到右搜索-I -l指定的目录,如果在这些目录中找不到,那么gcc会从由环境 变量指定的目录进行查找。头文件的环境变量是C_INCLUDE_PATH,库的环境变量是LIBRARY_PATH.如果还是找不到,那么会从系统指定指定的目录进行搜索。