静态库和动态库的区别及生成方式

静态库

  • 静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,windows和linux下都是后缀用”.a”,“xxx”为静态库名。
  • 链接时间: 静态库的代码是在编译过程中被载入程序中。
  • 链接方式:静态库的链接是将整个函数库的所有数据都整合进了目标代码。这样做优点是在编译后的执行程序不在需要外 部的函数库支持,因为所使用的函数都已经被编进去了。缺点是,如果所使用的静态库发生更新改变,你的程序必须重新 编译。

动态库

  • 动态库的命名方式与静态库类似,前缀相同为“lib”,linux下后缀名为“.so(shared object)”即libxxx.so;而windows 下后缀名为“.dll(dynamic link library)”即libxxx.dll。

  • 链接时间:动态库在编译的时候并没有被编译进目标代码,而是当你的程序执行到相关函数时才调用该函数库里的相应函 数。这样做缺点是因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。优点是动态库的改变并不影响 你的程序,所以动态函数库升级比较方便。

它们两个还有很明显的不同点:当同一个程序分别使用静态库,动态库两种方式生成两个可执行文件时,静态链接所生成的文 件所占用的内存要远远大于动态链接所生成的文件。这是因为静态链接是在编译时将所有的函数都编译进了程序,而动态链接是 在程序运行时由操作系统帮忙把动态库调入到内存空间中使用。另外如果动态库和静态库同时存在时,链接器优先使用动态库。

生成方式:

静态库:

 gcc -c file1.c   
  gcc -c file2.c          
    ...    
  gcc -c fileN.c    
  ar  -rcs libname.a file1.o file2.o ... fileN.o 

动态库:

 gcc  -shared  -fPIC  -o   lib库名.so   file1.c file2.c ... fileN.c

使用静态库或动态库:

gcc  文件名   -L lib_path   -l库名

猜你喜欢

转载自blog.csdn.net/qq_42153903/article/details/89404186
今日推荐