制作一个简单的四则运算动态库及测试

动态库(共享库)

动态库静态库的对比
注意:无论是制作动态库代码还是静态库代码,代码必须编译保证无错误
制作动态库的流程
在这里插入图片描述

  1. 准备代码

size.c


#include"si.h"
int add(int x,int y)
{
    return (x+y);
}
 
int del(int x,int y)
{
    return (x-y);
}
 
int mult(int x,int y)
{
    return (x*y);
}
 
int divi(int x,int y)
{
    return (int)(x/y);
}

size.h

#ifndef SI_HEAD_
#define SI_HEAD_

int add(int x,int y);
int del(int x,int y);
int mult(int x,int y);
int dive(int x,int y);

#endif
  1. 使用GCC将代码编译为动态库

    -fpic 将代码编译为位置无关代码(该代码的执行与所处内存位置无关)
    -shared 将代码编译为动态库

gcc size.c -o -fPIC -shared libsize.so
  1. 将代码文件与动态库链接

main.c

#include<stdio.h>
#include"si.h"
int main()
{
	int x,y,n;
	while(1)
	{
		printf("请输入两个数\n");
		scanf("%d%d",&x,&y);
		printf("请输入要进行的运算\n1.加法 2.减法 3.乘法 4.除法\n");
		scanf("%d",&n);
		switch(n)
		{
			case 1:
				printf("x+y=%d\n",add(x,y));
				break;
			case 2:
				printf("x-y=%d\n",del(x,y));
				break;
			case 3:
				printf("x*y=%d\n",mult(x,y));
				break;
			case 4:
				printf("x/y=%d\n",divi(x,y));
				break;
			default:
				printf("输入的序号出错,请重新输入\n");
		}
	}
	return 0;
}

执行以下指令将代码文件与动态库链接

gcc main.c -o main -L.-lsize

-L添加额外的动态库所在的路径 . 是当前路径
-l:添加额外的动态库的库名

然而报错
在这里插入图片描述
ldd 查看加载的库
在这里插入图片描述
可以看到原因:libsize.so not found
出错原因:
正常情况下加载动态库的流程
内核找不到库文件(自己建立的库文件不在/lib或/usr/lib内)
在这里插入图片描述
三种解决方法:

  1. 将自己的库文件存放在/lib或/usr/lib内

在这里插入图片描述

  1. 修改内核配置文件/etc/ld.so.conf.d
    在这里插入图片描述
sudo vim /etc/ld.so.conf.d/my.conf

在文件中添加以下语句
在这里插入图片描述
执行下列语句使之生效
在这里插入图片描述
3. 修改shell配置文件,不经过内核,直接使用shell搜索动态库

在这里插入图片描述

sudo vim /etc/bash.bashrc

在文件末尾添加下列语句
在这里插入图片描述

修改成功后再进行编译运行
在这里插入图片描述
动态库加载成功

附图:如何使动态库生效
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值