················Linux下························
Linux 文件系统中的 库文件 (静态链接库 动态链接库)
1. 静态函数库
这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
2. 动态函数库
这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。
linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。
共同点:
都为了 代码的共用性 复用性
将共用的功能模块 提前写好 需要时 链接就可以用了
区别:
静态库是在链接阶段使用,会将库文件的内容添加合成到最终的 可执行文件中,
动态库是在运行阶段使用
动态链接库(共享库) 运行阶段——》(可)执行文件(二进制文件)
静态库的制作:
gcc -c *.c --> *.o
ar crv libname.a *.o -->libname.a 静态库
静态库的使用:
gcc -o main main.o -L.(指定搜索静态库的路径) -l(指定库的名称)name
例子:
编辑三个c文件:
hadoop@hadoop-virtual-machine:~/桌面/ku$ cat pr1.c
#include <stdio.h>
void print1()
{
printf("`````````````1`````````\n");
}
hadoop@hadoop-virtual-machine:~/桌面/ku$ cat pr2.c
#include<stdio.h>
void print2()
{
printf("`````````````````````2`````````\n");
}
hadoop@hadoop-virtual-machine:~/桌面/ku$ cat main.c
#include <stdio.h>
void main()
{
printf("````````````main````\n");
print1();
print2();
}
hadoop@hadoop-virtual-machine:~/桌面/ku$
将 pr1.c 和pr2.c制作成静态库:
hadoop@hadoop-virtual-machine:~/桌面/ku$ ls
pr1.c pr2.c
hadoop@hadoop-virtual-machine:~/桌面/ku$ gcc -c pr1.c pr2.c
hadoop@hadoop-virtual-machine:~/桌面/ku$ ls
pr1.c pr1.o pr2.c pr2.o
hadoop@hadoop-virtual-machine:~/桌面/ku$ ar crv libpr.a pr1.o pr2.o
a - pr1.o
a - pr2.o
hadoop@hadoop-virtual-machine:~/桌面/ku$ ls
libpr.a pr1.c pr1.o pr2.c pr2.o
在main.c中链接静态库 调用两个函数:
hadoop@hadoop-virtual-machine:~/桌面/ku$ gcc -o main main.c -L./ -lpr
hadoop@hadoop-virtual-machine:~/桌面/ku$ ls
libpr.a main main.c pr1.c pr1.o pr2.c pr2.o
hadoop@hadoop-virtual-machine:~/桌面/ku$ ./main
````````````main````
`````````````1`````````
`````````````````````2`````````
共享库(动态库):
gcc -g -shared -fPIC -o libname.so *.c --> libname.so
(共享库)
共享库的使用:
gcc -o main main.o -L -lname
将共享库拷贝到默认搜索路径下
修改LD_LIBRARY_PATH环境变量
例子:
制作动态库:
hadoop@hadoop-virtual-machine:~/桌面/ku$ gcc -O -fpic -shared -o dl.so pr3.c
或者
hadoop@hadoop-virtual-machine:~/桌面/ku$ gcc -g -shared -fPIC -o libp.so pr3.c
使用动态库:
hadoop@hadoop-virtual-machine:~/桌面/ku$ gcc -o main main.c ./dl.so
hadoop@hadoop-virtual-machine:~/桌面/ku$ ./main
````````````main````
`````````````3`````````
头文件 在Linux中的/usr/include
终端中可以执行的命令 以及可执行程序 在 /bin (系统的一些命令) 或者/usr/bin (其他后来的程序的命令)
库文件 :静态库 共享库(Windows中叫做 .dll) 在系统中的/lib /lib
库: 已经编译好的方法的集合打包成一个文件 供其他程序使用
静态库:lib***.a (静态库文件有固定的前缀和后缀)
预编译main程序时将需要用到的库文件 全部包含在main中,#include<stdio.h>
将所有stdio.h里的函数 都复制到main主程序中
当运行时,内存中有重复代码,内存占用空间大 ,如果库文件做了改变,需要重新编译链接 才能运行。
共享库: lib***.so
要用到库文件中的方法,不需要全部包含进来,而是在程序运行时,再去库文件中找到方法,再加载到内存中 运行。