静态库&动态库的创建和使用


静态库的创建和使用

源代码

[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]# ls
add.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下面。但是这些目录下面貌似放的都是动态库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值