一步步教你编写实现Liunx静态库和动态库

函数库可以分为静态库和动态库

(1)静态库的同一函数被多次调用,则会有链接多次拷贝;
(2)动态库的同一函数被多次调用,则会尽在程序运行时内存中存在一份拷贝

在windows中,静态库的扩展名为.lib;动态库的扩展名为.dll;
在linux中,静态库的扩展名为.a,动态库的扩展名.so

动态库的搜索顺序
(1)环境变量LD_LIBRARY_PATH指定路径;
(2)/etc/ld.so.cache中缓存的动态库路径。可以通过修改配置文件/etc/ld.so.conf 增删路径(修改后需要运行ldconfig命令,实验室的板子不支持这种方式)
(3)默认的 /lib/;
(4)默认的 /usr/lib/

与动态链接库相关命令
(1)ld 是gcc的链接程序。
(2)ldd是查看可执行文件中所依赖的库的程序,比如想查main程序用到了那些动态库,可以直接 ldd main
(3)ldconfig用来更新文件/etc/ld.so.conf的修改生效。
(4)nm用来查看.so库中的函数名字,标记是T的就是动态库里面生成的名字。如:nm /lib/libc*.so

Ubuntu下静态库的创建和使用

创建库的.h文件 示例:mymath.h

#ifndef __MYMATH_H_ //防止头文件重复包含的条件编译
#define __MYMATH_H_
int getMax(int x,int y);
int getMin(int x,int y);
#endif 

创建库的.c文件 示例:mymath.c

#include "mymath.h"

int getMax(int x,int y){
	return x>y?x:y;
}

int getMin(int x,int y){
	return x<y?x:y;
}

第一步、将库函数源文件生成目标文件命令

不需要.h文件

gcc -c -o mymath.o  mymath.c

如果是arm版本则为

arm-linux-gnueabi-gnueabi-gcc  -c  -o  mymath.o  mymath.c

第二步、使用命令生成函数库命令:

ar rcs lib库名.a 目标文件列表

如果是arm版本则为

arm-linux-gnueabi-ar  rcs  lib库名.a   目标文件列表

例:
ar rcs libmymath.a mymath.o
如果是arm版本的则为:
arm-linux-gnueabi-ar rcs libmymath.a mymath.o

生成这样一个文件
在这里插入图片描述
编写测试程序main.c

#include <stdio.h>
#include "mymath.h"

int main(){
        int x,y;
        scanf("%d%d",&x,&y);
        int max=getMax(x,y);
        int min=getMin(x,y);
        printf("max=%d,min=%d\n",max,min);
        return 0;
}

第三步、使用gcc命令编译

 gcc  -o  可执行文件名 源文件列表  -L库路径  -l库名


gcc -o main main.c -L. -lmymath

然后就可以运行main可执行文件啦
在这里插入图片描述

Ubuntu下动态库的创建和使用

第一步、将mymath生成动态库

gcc -fpic -shared -o libmymath.so mymath.c

如果是arm开发版就要使用这个

arm-linux-gnueabi-gcc -fpic -shared -o libmymath.so mymath.c

第二步、动态库与源文件链接

gcc -o main main.c -L./ -lmymath

第三步、让动态链接库活起来

如果不配置动态链接库就会出现这情况
在这里插入图片描述

配置动态库的三种使用方法

1、将.so文件复制到/usr/lib目录下

注:ARM板子没有/usr/lib目录,需要把.so文件复制到/lib目录下就好了

2、将动态链接库的目录放到程序搜索路径中

可以将库的路径加到环境变量LD_LIBRARY_PATH中实现

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库.so

3.将动态链接库的目录放到/etc/ld.so.config.d文件夹中

先进入/etc/ld.so.config.d文件夹

sudo /etc/ld.so.conf.d

新建配置文件myprogram.conf

sudo vim myprogram.conf

文件内容就是你.so库目录的位置

# libc default configuration
/home/bees/myprogram/week5

注:一定要全路径,不能用~或$通配符
在这里插入图片描述

保存好配置文件,使用命令刷新动态库缓存(一定要加sudo)

sudo ldconfig

然后就可以运行与动态库链接的可执行文件了
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值