动态库和静态库的区别

1. 静态库的制作

  • ar rcs libmyhello.a hello.o
  • gcc -o hello main.c -L. -lmyhello

2. 动态库的制作

  • gcc -shared -fPCI -o libmyhello.so hello.o
  • gcc -o hello main.c -L. -lmyhello
  • ./hello //其中程序运行时会在/urs/lib和 /lib等目录下查找需要的动态库文件。因此我们需要将libmyhello.so复制到目录/usr/lib中,但是

3. 常用参数

  1. 格式:ar rcs libxxx.a xx1.o xx2.o
  • 参数r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置.
  • 参数c:创建一个库。不管库是否存在,都将创建。
  • 参数s:创建目标文件索引,这在创建较大的库时能加快时间。(补充:如果不需要创建索引,可改成大写S参数;如果.a文件缺少索引,可以使用ranlib命令添加)
  1. 格式:ar t libxxx.a
  • 显示库文件中有哪些目标文件,只显示名称。
  1. 格式:ar tv libxxx.a
  • 显示库文件中有哪些目标文件,显示文件名、时间、大小等详细信息。
    格式:nm -s libxxx.a
  • 显示库文件中的索引表。
  1. 格式:ranlib libxxx.a
  • 为库文件创建索引表。

4. 编译程序命令

  • 我们用gcc编译程序时,常常会用到“-I”, “-L”, “-i"等参数

gcc -o hello hello1.c hello2.c hello3.c -I/home/hello/include -L/home/hello/lib -lworld

  • -I/home/hello/include:表示将/home/hello/include 目录作为第一个寻找源代码中引入头文件的目录,寻找的顺序是:/home/hello/include->/usr/include->/usr/local/include, 也就是指定优先查找的目录,找不到的话查找默认目录。如果没有-I相关的指定,那么就是默认头文件的位置在当前文件夹。
  • -L/home/hello/lib:表示将/home/hello/lib目录作为第一个寻找库文件的目录,寻找的顺序是:/home/hello/lib->/lib->/usr/lib->/usr/local/lib, 如果-L. 表示当前文件夹, 如果-L./lib表示在当前文件夹下的lib文件夹里。
  • -lword:表示寻找具体的库文件, 如果加上编译选项 -static,表示寻找静态库文件。也可以用-l/home/hello/lib/libword.a 来代替-L/home/hello/lib -lword.

5. 动态库和静态库的区别

  1. 动态库和静态库的本质区别是,动态库是在程序运行时链接的,而静态库在编译时把代码加入目标程序,那么程序运行时就不需要了。所以使用静态库时生成的目标程序可以脱离源码运行,而动态库生成的目标程序,还需要先安装库才行
  2. 使用gcc编译的静态库,在生成目标程序链接的过程中也只能用gcc编译;同理使用g++编译的静态库在生成目标程序链接的过程中也只能用g++编译。否则会报错"undefined reference to 'Fun1()'
  3. 用gcc编译目标程序时,main.c中可以不需要#include "lib.h",会报warning,但是不会报error;但是用g++编译时,一定要加 #include "lib.h",不然编译不通过,因此用g++编译的静态库,还需要它的所有头文件才能使用。
  4. 当你更改库文件的一些宏定义或者其他东西时,需要重新编译静态库,不然你的修改没有起作用。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容