静态库和共享库
共享库相当于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
静态库和共享库的工作关系