文章目录
Linux系统中的库
库:在系统中是一个二进制文件,它有.c(没有main)文件编译而来的,其他的程序就是使用这个库中的函数了,其中库又分为静态库和动态库。不同的操作系统对应库文件的格式不同。由于库文件是二进制文件,所以不能够看到函数的实现过程,只能调用函数,比较安全。
windows:
xxx.lib (静态库)
xxx.dll (动态库)
linux:
libxxx.a (静态库)
libxxx.so (动态库)
test.c
|
|
printf函数<==========#include <stdio.h>(这个函数的声明)
<==========函数的实现libc.so (Linux系统的动态库)<=======gcc -lc =========xxxx.c
test.c
|
|
pow函数 <==========#include <math.h>(这个函数的声明)
<==========函数的实现libm.so (Linux系统的动态库)<=======gcc -lm=========xxxx.c
1、静态库
静态库:静态库是将xxx.c文件编译生成一个lib库名.a的二进制文件,当你需要使用这个库中的某个函数的时候直接调用这个库中的函数即可。gcc在编译代码的时候会将你的文件和库最终编译生成一个二进制的文件(把库也放到可执行程序中了),可执行程序的体积比较大,但是在执行可执行程序的时候,就不需要找库文件了(可执行文件可以单独执行),所以使用静态库编译的程序执行效率比动态库的高。
1.1制作静态库
add.c
int add(int a,int b)
{
return (a+b);
}
add.h
#ifndef __ADD_H__
#define __ADD_H__
int add(int a,int b);
#endif
main.c
#include <stdio.h>
#include "add.h"
int main(int argc, const char *argv[])
{
printf("sum = %d\n",add(100,200));
return 0;
}
编译生成静态库:
gcc -c add.c -o add.o **//只编译不链接**
ar -cr libadd.a add.o **//ar 制作静态库的命令 -c 创建静态库 -r将文件中的函数放到库中**
**//将add.o编译生成libadd.a的静态库**
1.2使用静态库
-L :指定库的路径
-l :链接要使用的库
-I :指定头文件的路径
1.3多路径使用库
2、动态库
动态库:动态库是将xxx.c文件编译生成一个lib库名.so的二进制文件,当你需要使用这个库中的某个函数的时候直接调用这个库中的函数即可。gcc在编译代码的时候会将你的文件和库中函数的符号表编译生成一个二进制的文件,可执行程序的体积比较小,但是在执行可执行程序的时候,必须去找lib库名.so的文件,效率比静态库的低。一个动态库可以被多个程序共享,动态库又叫共享库。
2.1动态库的制作
add.c
int add(int a,int b)
{
return (a+b);
}
add.h
#ifndef __ADD_H__
#define __ADD_H__
int add(int a,int b);
#endif
main.c
#include <stdio.h>
#include "add.h"
int main(int argc, const char *argv[])
{
printf("sum = %d\n",add(100,200));
return 0;
}
编译生成动态库:
gcc -fPIC -c add.c -o add.o **//-fPIC 忽略文件的位置 ,将add.c生成了add.o**
gcc -shared add.o -o libadd.so **//-shared生成动态库**
**//将add.o的二进制文件编译生成libadd.so的库**
或
gcc -fPIC -shared add.c -o libadd.so
2.2动态库的使用
-L :指定库的路径
-l :链接要使用的库
-I :指定头文件的路径
2.3执行依赖动态库程序时候错误的解决方法
1.在命令行指定库的路径(LD_LIBRARY_PATH)
注:上述的解决方法只在当前终端生效
2.将上述的库放在系统库的路径下(/lib /usr/lib/)
3.修改系统的库的配置文件
sudo vi /etc/ld.so.conf.d/libc.conf //修改系统的配置文件
sudo ldconfig //让配置文件生效