静态库的创建和使用
源代码
[root@foundation101 static_lib_test]# pwd
/home/kiosk/Desktop/mycode/static_lib_test[root@foundation101 static_lib_test]# cat add.c
/*
* 要编译为静态库的模块文件
* 2015-04-10
*/
extern int cnt;
void add( const int a, const int b){
printf("%d + %d = %d\n",a,b,a+b);
cnt++;
}
[root@foundation101 static_lib_test]# cat sub.c
/*
* 要编译为静态库的模块文件
* 2015-04-10
*/
int cnt=0;
void sub(const int a,const int b){
printf("%d - %d = %d \n",a,b,a-b);
cnt++;
}
[root@foundation101 static_lib_test]# cat calaulate.h
/*
* 指定静态库中的函数和全局变量
* 2015-04-10
*/
extern int cnt;//记录总共作了多少次运算
extern void sub(const int a,const int b);
extern void add(const int a,const int b);
[root@foundation101 static_lib_test]# cat main.c
#include <stdio.h>
#include "calaulate.h"
void main(){
int a=5,b=3;
add(a,b);
sub(a,b);
printf("the calue of cnt is :%d \n",cnt);
}
创建静态库
[root@foundation101 static_lib_test]# pwd/home/kiosk/Desktop/mycode/static_lib_test
[root@foundation101 static_lib_test]# gcc -c sub.c add.c -w
[root@foundation101 static_lib_test]# ls
add.c add.o calaulate.h main.c sub.c sub.o
[root@foundation101 static_lib_test]# ar rcs libjisuan.a add.o sub.o
其实真正的库名是jisuan,只不过静态库文件名的命名规范是前面加lib后面加.a。使用静态库时,我们只需要指定静态库的真实名字就好了。指定全名的话会找不到的。
c:如果不存在我们指定的libjisuan.a这个库,那就创建。
r:把后面列出的目标文件加入到静态库libjisuan.a中。如果库中之前有同名的目标文件则会覆盖之前的。
s:更新静态库的文件索引,使之包含新加入的目标文件
[root@foundation101 static_lib_test]# ls
add.c add.o calaulate.h libjisuan.a main.c sub.c sub.o
[root@foundation101 static_lib_test]# ar tv libjisuan.a 查看库中所包含的目标文件只写t不写v的话只能看到目标文件的文件名。
rw-r--r-- 0/0 1616 Apr 11 03:40 2015 add.o
rw-r--r-- 0/0 1616 Apr 11 03:40 2015 sub.o
[root@foundation101 static_lib_test]# nm -s libjisuan.a 查看库文件的索引
Archive index:
add in add.o
cnt in sub.o
sub in sub.o
add.o:
0000000000000000 T add
U cnt
U printf
sub.o:
0000000000000000 B cnt
U printf
0000000000000000 T sub
使用静态库
方法一:[root@foundation101 static_lib_test]# gcc main.c ./libjisuan.a -o main2
[root@foundation101 static_lib_test]# ls
add.c add.o calaulate.h libjisuan.a main2 main.c sub.c sub.o
[root@foundation101 static_lib_test]# ./main2
5 + 3 = 8
5 - 3 = 2
the calue of cnt is :2
方法二:
[root@foundation101 static_lib_test]# gcc main.c -o main -L./ -ljisuan
[root@foundation101 static_lib_test]# gcc main.c -o main -L./ -l jisuan
[root@foundation101 static_lib_test]# gcc main.c -o main -L ./ -l jisuan
[root@foundation101 static_lib_test]# gcc main.c -o main -L/home/kiosk/Desktop/mycode/static_lib_test -l jisuan
-L:静态库所在的目录,可以使用绝对路径,也可以使用相对路径。L和后面的路径之间可以有空格也可以没有空格。
-l:指定静态库的真实的名字,注意是真实的名字哦,不然会报找不到的。同样l和库名字之间可以有空格也可以没有空格。
-l是连接器选项,一定要放在被编译的源文件的文件名之后。我觉得以后就按上面的顺序写就好了。
方法三:
[root@foundation101 static_lib_test]# mv libjisuan.a /lib/
[root@foundation101 static_lib_test]# ls
add.c add.o calaulate.h main.c sub.c sub.o
[root@foundation101 static_lib_test]# gcc main.c -o main -ljisuan
[root@foundation101 static_lib_test]# ldd mian
ldd: ./mian: No such file or directory
[root@foundation101 static_lib_test]# ldd main
linux-vdso.so.1 => (0x00007fff2a3fe000)
libc.so.6 => /lib64/libc.so.6 (0x00007f3f5e1dc000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3f5e5b1000)
[root@foundation101 static_lib_test]# ./main
5 + 3 = 8
5 - 3 = 2
the calue of cnt is :2
动态库的创建和使用
创建动态库
[root@foundation101 dynamic_lib_test]# lsadd.c calaulate.h main.c sub.c
[root@foundation101 dynamic_lib_test]# gcc -fPIC -shared -o libjisuan.so add.c sub.c
[root@foundation101 dynamic_lib_test]# ls
add.c calaulate.h libjisuan.so main.c sub.c
使用动态库
方法一:[root@foundation101 dynamic_lib_test]# gcc main.c ./jisuan.so -o main
这里一定要指明.so的路径./你也可以写绝对路径
[root@foundation101 dynamic_lib_test]# ./main
5 + 3 = 8
5 - 3 = 2
the calue of cnt is :2
方法二:(推荐)
[root@foundation101 dynamic_lib_test]# gcc main.c -o main -ljisuan -L./
[root@foundation101 dynamic_lib_test]# ./main
./main: error while loading shared libraries: libjisuan.so: cannot open shared object file: No such file or directory
[root@foundation101 dynamic_lib_test]# vim /etc/ld.so.conf 需要修改这个文件
[root@foundation101 dynamic_lib_test]# pwd
/home/kiosk/Desktop/mycode/dynamic_lib_test
[root@foundation101 dynamic_lib_test]# vim /etc/ld.so.conf
[root@foundation101 dynamic_lib_test]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/home/kiosk/Desktop/mycode/dynamic_lib_test
[root@foundation101 dynamic_lib_test]# ldconfig
方法三:(推荐)
就是把动态库拷贝到/lib 或者/usr/lib下面,这样可以省去-L参数
[root@foundation101 dynamic_lib_test]# mv libjisuan.so /usr/lib/
[root@foundation101 dynamic_lib_test]# ldconfig
[root@foundation101 dynamic_lib_test]# ls
add.c calaulate.h main.c sub.c
[root@foundation101 dynamic_lib_test]# gcc main.c -o main -l jisuan
[root@foundation101 dynamic_lib_test]# ./main
5 + 3 = 8
5 - 3 = 2
the calue of cnt is :2
总结
创建方法不一样:
静态库:ar rcs libXX.a xx.o xxx.o
动态库:gcc -fPIC -shared libXX.so xx.c xxx.c
使用方式完全一样:
本质上,库就是.o文件。
虽然可以把静态库.a拷贝到系统的库目录下面/usr/lib 或者/lib下面。但是这些目录下面貌似放的都是动态库。