Linux系统中的库

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       //让配置文件生效

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值