首页 > 代码库 > 02gcc入门(下)

02gcc入门(下)

基本框架:

a)         外部库的使用

b)         静态库与共享库的区别

c)         静态库的生成

d)         共享库的生成

 

2.1外部库的使用

2.1.1库文件的特点:

           1)库文件实际上是一些.o文件的打包;

2)是按照可重用的原则编写的;

3)通常由一组相互关联的函数构成;

           4)软件的可维护性能好,若软件升级的话,通常只需修改库代码,而不用修改使用库的代码(只要使用库的接口没有改变)。

2.2.2头文件与库文件的系统存放位置

         头文件:/usr/include   /usr/local/include

         库文件:/usr/lib       /usr/local/lib

2.2.3 外部库的使用

         -lname  表示要链接libname.so 或者libname.a 库文件

                 如果静态库和共享库均存在,则系统会优先链接共享库。

 

2.2静态库与共享库的区别

 

    静态库(.a)的特点:

1)程序在链接的时候把所需要库中相应的函数代码链接到可执行文件中;

2)运行的时候不再需要静态库;

3)若多个程序使用同一个库,则需要库中相关代码的多个copy,所以对内存和磁盘空间耗费较大。

    共享库(.so)的特点:

1)  当程序运行时,由操作系统将库代码从磁盘加载到内存中,这个过程叫做动态链接;

2)  运行的时候需要共享库的存在;

3)若多个程序使用同一个共享库,则当程序运行的时候,只需向内存加载一份库代码,多个程序共享使用同一份库;

又因为可执行程序中仅仅包含它用到的函数入口地址的一个表,而不是库代码的拷贝;

所以节省了内存和磁盘空间;

                4)因为可执行程序中没有库代码的相关拷贝,所以维护性能好。

              

2.3静态库的生成

 

2.3.1静态库的生成

   Ar  rcs  libname.a  name.o

   Rcs表示(replace、create、save)

   *   Ar  t        查询一个静态库中有多少个.o文件

2.3.2库的搜索路径:

1)  从左到右搜索 –I  –L 指定的目录;   (最好使用第1种方法来设定)

2)  由环境变量指定的目录

设定方法:给配置文件(~/.bash_profile)中相应的环境变量添加搜索路径:

export   C_INCLUDE_PATH=……     

export   CPP_INCLUDE_PATH=……

                    export   LIBRARY_PATH=……

然后执行该配置文件即可。

3)  系统默认的搜索目录

/usr/include     /usr/lib

 

2.4共享库的生成

 

2.4.1共享库的生成

Gcc   –shared  -fPIC  hello.o  –o  libhello.so

fPIC:  用来产生位置无关码(position independent code)

 

2.4.2运行共享库需要做的一些配置(2种方法)

     1)拷贝.so文件到系统共享库路径下:  /usr/lib

     2) 设定环境变量: LD_LIBRARY_PATH  (最好使用第二种方法)

 

l   ldd  + 可执行文件名: 查询该程序在执行的时候需要加载哪些共享库。