Head|Head First C学习之动态库于静态库

函数库分为静态库和动态库两种。

静态库在程序编译时会被连接目标代码中,程序运行时将不再需要该静态库
这类库的名字一般是libxxx.a
动态库在程序编译时会被连接目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
这类库的名字一般是libxxx.so
静态库的创建
一、#include <>代表标准头文件, 只要头文件在标准目录中
/usr/local/include //第三方库的头文件,编译器会先检查这个。 /usr/include//操作系统的头文件

二、#include ""为本地头文件编译程序 三、共享.h都文件
  • 1、把头文件放到标准目录中。
  • 2、include语句中使用完整路径。
  • 3、用gcc -I选项指定头文件目录。
四、nm命令 Head|Head First C学习之动态库于静态库
文章图片
nm命令.jpg 五、ar存档命令 Head|Head First C学习之动态库于静态库
文章图片
ar命令.jpg
  • 所有.a文件都是libXXX.a形式命名的。
  • 存档是静态库(static library)。
  • .a文件保存在标准目录中。
  • 也可以放到自己的库目录中。
  • `ar -t<文件名>命令会列出存档中的目标文件。
  • ar -x<文件名.a> <文件名.o>会从存档中取出想要的目标文件。
六、利用库文档编译其他程序 Head|Head First C学习之动态库于静态库
文章图片
gcc_ar.jpg
如果使用的是自建的库;
gcc test_code.c -L/my_lib -lhfsecurity -o test_code

动态库的创建
动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。
都是由*.o目标文件生成。
一、创建目标代码
Head|Head First C学习之动态库于静态库
文章图片
fPIC.jpg
在创建hfcal.o时,多加了一盒标志 -fPIC。它告诉gcc创建位子无关的代码。事实上大多系统不需要加这个选着。
【Head|Head First C学习之动态库于静态库】位置无关代码:计算机把它加载到存储器的哪个位置都可以运行的代码。
二、不同平台的动态库
  • Windows中动态库通常叫动态链接库,后缀名是.dll
  • LinuxUnix上叫共享目标文件,后缀名.so
  • 而在MAC上,它们叫动态库,后缀名.dylib
  • 尽管后缀名不同,但是创建它们的方法相同。
    Head|Head First C学习之动态库于静态库
    文章图片
    gcc-shared.jpg
    -shared选项告诉gcc你想把.o文件转化为动态库。
    假设在linux中创建一个叫libhfacl.so的库,,那么libgfcal.so就会记住它的苦命叫hfcal。
    注意:
  • 一旦用了某个名字编译了库,就不能载修改文件名了,若想从命名库,就必须用心的名字重新编译一次。
  • 一些老的MAC系统上没有-shared,可以用-dynamiclib代替。
编译程序是实用的命令和静态存档是一样的。 不同平台运行时,会有一些差异性,就是配置动态库的环境变量。

    推荐阅读