【Linux】Linux系统教程二:linux动静态库

一、库的概念

函数:某些功能代码的封装,可能通过将函数声明放置头文件当中,给其它文件进行调用,那么封装的函数可见(可以使用代码实现的过程),称为开源。封装的函数不可见(将代码实现的过程进行封装动静态库),称为闭源(不开源)。

linux下有动静态库

linux以.a结尾的是静态库,以.so结尾的为动态库; linux下默认的库路径/lib及/usr/lib

静态库:在编译时以函数叠加的方式增加到代码中,使用运行,可脱离库运行。使用静态库生成的可以文件相对较大,内存开销大,但是运行效率高。

动态库:在编译时以链接的方式增加到代码中,当需要库函数时,才调用,使用动态库生成的可以文件相对较小,内存开销小,但是运行效率略低。

二、静态库的创建与使用

使用ar工具创建静态库的时候需要两个参数:

参数c:创建一个库,不管库是否存在,都将创建。
参数r:在库中插入模块 (替换)。默认新的成员添加在库的结尾处,如果模块名已经在库中存在,则替换同名的模块。

(1)在某个目录下编写三个.c(main.c add.c sub.c)文件及两个.h(add.h sub.h)文件。这个工程必须是编译通过才能制作库。

gec@ubuntu:~/Desktop/project$ gcc *.c -o main

或者
gec@ubuntu:~/Desktop/project$ gcc main.c add.c sub.c -o main

(2)将需要封装.c文件生成.o文件

gec@ubuntu:~/Desktop/project$ gcc -c add.c sub.c

(3).o文件生成.a(静态库文件), ar:生成静态库命令。静态库命名:lib+库名(自定义)+.a 比如:libmylib.a

gec@ubuntu:~/Desktop/project$ ar -rc libmylib.a add.o sub.o

(4)运用

gec@ubuntu:~/Desktop/project$ gcc main.c -o main libmylib.a 
gec@ubuntu:~/Desktop/project$ ./main

(5)假设静态库在某个路径,链接方法:

gec@ubuntu:~/Desktop/project$ gcc main.c -o main /home/gec/libmylib.a 

使用:
(1)在某个目录下编写三个.c(main.c add.c sub.c)文件及两个.h(add.h sub.h)文件。这个工程必须是编译通过才能制作库。

gec@ubuntu:~/Desktop/project$ gcc *.c -o main

或者
gec@ubuntu:~/Desktop/project$ gcc main.c add.c sub.c -o main

(2)将.c文件生成.so文件,动态库命名::lib+库名(自定义)+.so+(版本号)

gcc -fpic -shared xxx.c xxx.c -o libxxx.so
-fpic:表示编译为独立的代码块
-shared:指定生成动态库
libxxx.so:库名

gec@ubuntu:~/Desktop/project$ gcc -fpic -shared sub.c add.c -o libmylib.so

(3)使用动态库进行编译(直接编译)

gec@ubuntu:~/Desktop/project$ gcc main.c -o main libmylib.so 
或
gec@ubuntu:~/Desktop/project$ gcc main.c -o main ./libmylib.so (./表示当前路径)
或
gec@ubuntu:~/Desktop/project$ gcc main.c -o main /home/gec/libmylib.so 

(4)使用动态库进行编译(间接编译),假设动态库文件在:/home/gec目录下

gec@ubuntu:~/Desktop/project$ gcc main.c -o main -L /home/gec/ -lmylib

gcc main.c -o main -L /home/gec/ -lmylib
-L            :指定库的路径标志
 /home/gec/    :库所在的路径
-l            :链接库标志
mylib        :库名

(5)假设头文件(/home/gec/include)与main.c不同的路径,编译方法:

gcc main.c -o main -L /home/gec/ -lmylib -I /home/gec/include/

-I        :指定头文件的路径标志
/home/gec/include/:关文件路径

或者将库存文件放置在系统默认的库路径下
/lib    或者/usr/lib

gec@ubuntu:~/Desktop/project$ sudo cp /home/gec/libmylib.so /usr/lib
gec@ubuntu:~/Desktop/project$ gcc main.c -o main -lmylib

使用动态库编译的程序运行方法:
方法1:将动态库放置到系统默认的库路径中
/lib 或者/usr/lib
sudo cp libmylib.so /lib

gec@ubuntu:~/Desktop/project$ sudo cp libmylib.so /lib
gec@ubuntu:~/Desktop/project$ ./main

方法2:将动态库放置在任何位置,在系统的启动文件中添加环境变量即可,然后环境变量生效。

gedit  ~/.bashrc 

在文件最后一行添加
export LD_LIBRARY_PATH=/home/gec:$LD_LIBRARY_PATH

执行下面命令,使环境变量生效
source ~/.bashrc 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值