动静态库原理

静态库.a

lib文件夹,存放着所有的库。

我们想写了自己的部分功能实现和代码,很多个.0和.h  但是实现文件太多了,我们把它打包在一起就是静态库。

那么如何打包呢?ar命令

ar -rc libhello.a mython.o myprintf.0
r 代表打包 c创建  前面必须有lib后缀有.a

这样就会形成libhello.a的静态库

打包我们可以在makefile里面来写

动静态库原理_第1张图片

那么做好只会该怎么发布呢?一般会有一个include文件夹,这个文件夹里面放着所有的头文件,还有lib文件夹,这个文件夹里面放着所有的库文件。

动静态库原理_第2张图片 然后把这个文件夹给对方。那么对方怎么用呢?

gcc 头文件的默认搜素目录是/usr/include

库文件搜索目录/lib64或usr/lib64

自己写的库属于第三方库,编译的时候要

gcc main.c -lhello
-l 代表链接库 去掉前缀和.a写的时候 
把头文件和库文件,拷贝到库里面这样子叫库的安装。
如果指定目录,不在对应的库目录里面需要使用I 指定头文件目录和库文件目录
gcc main -I./hello/include/ -L./hello/lib/ -hello

静态库是把代码拷贝到文件里面,一旦生成文件之后,更新之后需要重新编译

动态库.so

动态库生成的时候需要加fPIC

gcc -fPIC -c myfile.c myfile.o
fPIC :形成与位置无关的二进制目标文件

静态库是加载是时候需要拷贝到文件之中,必须在特定位置中拷贝好才能使用。而动态库则不用。readelf -S可以查看生成文件使用了那些库。

打包动态库

gcc -shared myprint.o myhello.o libhello.so
这样子可以形成动态库.so文件    

同时生成静态库和动态库

动静态库原理_第3张图片

 使用-l 链接默认的是动态库还是静态库呢?当动静态库的时候默认使用动态库。如果只有静态的时候没办法只能使用静态库。那么如果强制使用静态库呢?需要加 -static。动态库在加载的时候只要建立映射关系就可以了。

但是动态库编译的时候这样子就可以了吗?不可以,gcc编译的时候明白,但是,指向的时候操作系统不知道。那么在运行动态库的时候需要

1、拷贝.so文件到系统共享库路径下, 一般指/usr/lib

2、更改LD_LIBRARY_PATH

 

[root@localhost linux]# export LD_LIBRARY_PATH=¥xxxxz自己的库目录
 [root@localhost linux]# gcc main.c -lmymath
 [root@localhost linux]# ./a.out
 add(10, 20)=30
 sub(100, 20)=80

或者修改配置文件

动静态库原理_第4张图片

 一般是在 置/etc/ld.so.conf.d/ 在这个新建xxxx.conf。然后把自己想要添加的动态库目录,然后粘贴到这个配置文件里面,然后ldconfig.

为什么要写库:

大大减少软件开发周期,提高软件的健壮性,提高软件本身的质量,代码安全。有一定的加密成分。

你可能感兴趣的:(Linux,linux)