linux入门动静态库
Posted 世_生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux入门动静态库相关的知识,希望对你有一定的参考价值。
认识动静态库
我们在Linux编写C代码时,默认是用动态库。
动静态库其实是一堆目标文件(.o)的集合,是一些可执行文件的“半产品”。
链接时,把各个.O文件进行链接,最终形成可执行程序。
当一堆.o文件要被大量使用时,我们把这些目标文件进行打包,就形成了一个库。
动静态库的各自特征
静态库:程序在进行汇编链接时,把库的代码直接复制到可执行文件中。这样就不需要静态库库。
使用静态库生产的可执行文件一般比较大。
动态库:程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。
在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接。动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。
静态库的优点:可独自运行,不需要库。
静态库的缺点:使用静态库,可执行文件大,在运行时要占用的内存比较大,在磁盘中也要占用比较大的空间。当多个静态程序加载时,且都使用相同的静态库,在内存中就会有大量的重复代码,
动态库的优点:节省磁盘空间,在多个进程运行时,由于动态库可以在多个程序间共享,在内存中不会出现重复的代码,也节省内存空间。
动态库的缺点:依赖库。
制作并使用使用动静态库
动静态库是一堆目标文件的集合,所以我们先要生产目标文件(.o)。我们使用两个源文件add.h和add.c
静态库的制作
制作一个加法的静态库,看代码:
//在add.h中
#pargma once
int my_add(int x,inty);
//在add.c中
#include "add.h"
int my_add(int x,int y)
return x+y;
打包成静态库:
一、生产.O文件
二、使用ar 命令打包成静态库//ar -rc libmymath.a add.o
查看静态库中的目录列表
[root@localhost linux]# ar -tv libmymath.a
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 add.o
t:列出静态库中的文件
v:verbose 详细信息
在我们要把自己的静态库给别让用的情况下,我们要把我们的静态库和头文件放在同一目录下。
静态库的使用
看代码:
#include"add.h"
#include<stdio.h>
int main()
int a=1;
int b=2;
int z=my_add(a,b);
printf("%d\\n",z);
return 0;
一、用的时候标明自己制作的静态库路径,让gcc编译器找到。
[root@localhost linux]# gcc text.c -I -L. -lmymath
-L 指定库路径
-I 指名静态库的路径
-l 指定库名
二、把静态库和头文件的路径拷贝到系统目录下
sudo cp my_lib/include/* /usr/include/
sudo cp my_lib/lib/* /usr/lib64/
注意:在使用的时候,还是要标明要使用的是哪个库。
学到这里,我们现在要有一点的认识了。其实我们在安装程序是,就是拷贝头文件和库文件到系统路径下。但是不要把自己弄的库也拷贝到系统路径下,这样会造成系统文件的污染。
动态库的制作:
第一步生成可执行文件
打包
组织//和上面一样
这里要重点说明的是使用。
在使用的过程中,只是告诉编译器路径是没有的,虽然形成了可执行程序,但是运行不了,这是因为在使用的时候,系统找不到这个动态库。
解决有三个方法:
1、把我们直接把库文件拷贝到系统路径下,这样系统就能找到对应的库了。
2、更改LD_LIBRARY_PATH,系统在找路径是,一般是使用环境变量来找的,如ls命令。LD_LIBRARY_PATH就是存放动态库路径的环境变量,我们只需要把动态库所在的目录路径添加进去就行。
3、配置/ect/ld.so.conf.d/
/ect/ld.so.conf.d/
路径下面存放的全是以.conf为后缀的配置文件,这些文件存放的全是路径,系统会自动在这个路径下找到所以配置文件里面的路径,然后再这些路径下找所需要的库。我们只要把库的路径存放到一个.conf为后缀的文件中,然后把该文件存放到该路径下,就可以找到我们需要的库。
最后我们还要使用ldconfig
命令将配置文件更行一下。
以上是关于linux入门动静态库的主要内容,如果未能解决你的问题,请参考以下文章