静态库和共享库

静态库和共享库

共享库相当于c++中的dll。静态库是在可执行程序运行前就已经加入到执行代码中,成为执行程序的一部分,按照习惯一般以.a作为文件后缀名,使用ar命令可以创建静态库,静态库在应用程序生成时,可以不必载编译,节省再编译时间;共享库,是在执行程序启动时加载到执行程序中,可以被多个执行程序共享使用。

本节所讲的执行程序和库都采用ELF格式。

一、静态库

要创建一个静态库,或要将目标代码加入到已经存在的静态库中,可以用以下命令

ar  rcs libmylib.a file1.o

若libmylib不存在,会自动创建一个。然后更新.a文件的索引,使之包含新加入的.o命令。静态库创建成功后,需要链接到应用程序中使用。使用gcc的-l选项来指定静态库,使用-L参数来指定库文件的搜索路径。

二、共享库

共享库的创建比较简单,基本有两步。首先使用-fPIC或-fpic创建目标文件,pic表示位置无关代码(寻找是以相对路径,偏移地址而不是绝对路径,开发往往要求与位置无关,不管放在内存的哪个位置都可以执行),然后就可以使用以下格式创建共享库了:gcc -share -W1,-soname,your_soname -o library_name file_list library_list

共享库寻址

示例:

1.gcc  -fPIC -c a.c   //-c只编译,生成.o文件,不进行链接

gcc -fPIC  -c b.c

gcc -shared -W1 -o  libmyab.so a.o b.o

gcc -shared -W1,-soname,libmyab.so.1  -o  libmyab.so.1.10 a.o b.o

按照共享库的命令惯例,每个共享有三个文件名:real name、soname和linker name。真正的库文件(而不是符号链接),共享库一般都是以.so为后缀,中的。1.0.1表示版本号,real nam为libmyab.so.1。

                                                               共享库命名

         so name主要是用来判断此app的主版本号能否在此电脑上库运行,主要工作在运行阶段,link name没有出现任何版本信息,方便编译链接使用,若版本号改变,只要将link name重新链接就好,其他使用到link name的地方都不需要更改,方便Makefile

2.共享库加载

(1)修改/etc/ld.so.conf

sudo vi /etc/ld.so.conf

添加你的共享库路径

ldd 程序名,能够查找程序执行时候依赖于哪些库

(2)更新查找共享库路径

sudo   ldconfig -v

(3)ln -s  libmycal.so1.10 libmycal.so  手动创建一个link name

 静态库和共享库的工作关系

原文地址:https://www.cnblogs.com/rainbow1122/p/7793724.html