动态库和静态库

1. 概念介绍html

我理解的库分为数据库和程序库,通常来讲库是被调用的,不能够单独执行。数据库

数据库也包括对数据的操做部分,可是主要围绕数据;函数

程序库就是提供接口、专门实现某些功能的函数。spa

 

程序库(函数库)分为静态库和动态库。.net

前者在连接的时候加入到执行代码中,连接以后能够删除,不会影响程序执行;htm

后者在连接时只是指定了库的位置,不会加入代码中,程序执行前删除动态库会出问题。blog

 

动态库的优势:索引

  • 是代码(什么意思???)
  • 易于模块更新,更新库时源程序不须要从新编译
  • 节省大量空间!

 

 

2. 静态库的生成和使用接口

①编译get

g++ -c print_hello.cpp print_world.cpp

把源文件cpp编译成多个.o静态库,能够一次编译多个;
使用gcc或者g++,默认生成的.o文件就是静态库

②打包

ar csrv libprint_helloworld.a print_hello.o  print_world.o

ar可集合许多文件成为单一的备存文件,全部成员文件皆保有原来的属性与权限;
该命令将目标文件1~n加入到指定的静态库中。若是该静态库不存在,则建立静态库文件。
静态库.a文件,是一些.o目标文件的集合,有.o生成.a的过程,其实就是一个打包

  • 参数r:把列表中的目标文件加入到静态库中
  • 参数c:若指定的静态库不存在,则建立该库文件
  • 参数s:更新静态库文件的索引,是指包含新加入的目标文件的内容

③连接

g++ -o main main.cpp -L./ -lprint_helloworld

注意这里的格式:
a. -L紧跟着路径
b. -l+静态库名,不要后缀.a
使用.a静态库连接成可执行文件,连接以后能够删除全部的.o和.a静态库文件;
静态库在程序连接的时候使用,链接器会将程序中使用到的函数的代码从库文件拷贝到可执行文件中
一旦连接完成,在程序执行的时候就不须要静态库了。

 

 

3. 动态库的生成和使用

①生成.o静态库:

g++ -c -fPIC print_hello.cpp print_world.cpp

②制做动态库
g++ -shared  -o libprint_helloworld.so print_hello.cpp print_world.cpp
-fPIC用于生成与位置无关的代码,-shared用于将位置无关的代码制做成动态库。

③连接

g++ -o main main.cpp -L. -lprint_helloworld

上面的一些规则,好比.so文件的开头是lib,-L后面紧跟着路径,-l后面+动态库可是不加后缀……都是为了保证这一步连接能够顺利完成!

假如这一步连接随意一点:g++ -o main main.cpp print_helloworld.so,那么上面的规则都不须要!

④添加进库/usr/lib/

上面完成以后,直接执行:.main会出错——找不到库文件。

还须要把共享库添加进合适的位置: sudo cp print_helloworld.so /usr/lib/

由于虽然连接的是当前目录的libprint_helloworld.so,可是执行的时候确实从共享库文件夹里面寻找

我猜这样作的机制,是为了鼓励人们把共享库放到你们均可以够得着的地方。

 

 

4. 直接编译+连接
连接的时候不必定使用库文件,还能够直接使用cpp文件!
g++ -o main main.cpp print_hello.cpp print_world.cpp

默认是先编译生成静态库.o,而后再进行连接,连接完毕以后删除.o文件。

 

 

参考连接:

https://my.oschina.net/daowuming/blog/775068

https://www.cnblogs.com/li-hao/archive/2012/03/01/2376227.html

相关文章
相关标签/搜索