qq_40995354的博客

计算机基础

编写简单的add/sub/mul/div函数,并打包成动/静态库,并分别使用

静态库(.a):在windows下后缀为(.lid),程序在编译链接的时候把库的代码链接到可执行文件里。程序运行的时候将不再需要静态库。

动态库(.so):在windows下后缀为(.dll),程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程叫动态链接。动态库可以在多个程序间共享,所以动态链接使用可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一部分动态库被要到该库的所有进程共用,节省了内存和磁盘空间。

静态库

我们先来写一个静态库,实现一个简易计算器,下面只写一个加法,减乘除类似。

分别创建.h.c文件

#ifdef _ADD_H__
#define _ADD_H_
#include<stdio.h>
int myadd(int a,int b);

#endif //_ADD_H_


#include "add.h"
int myadd(int a,int b){
return a+b;

}

<1>写好之后gcc -c add.c sub.c mul.c div.c编译生成.o文件。

<2>将编译生成的文件用以下命令生成静态库。注意:这里的库名是叫math,要生成静态库,需要给前面加上lib,后面加上.a。ar是gnu归档工具,rc表示replace and create


<3>用以下命令查看静态库的目录列表。t:列出静态库中的文件,v:详细信息


<4>创建一个测试目录,将上一级的静态库和.h都拷贝过来。*是通配符,当前目录下所有同类型的文件。


<5>创建一个main.c文件来实现函数功能。

#include<stdio.h>
#include "add.h"
#include "sub.h"
#include "mul.h"
#include "div.h"
int main(){
int x = 70;
int y = 30;
int z = add(x,y);
int l = sub(x,y);
int m = mul(x,y);
int n = mul(x,y);
printf("%d ,%d ,%d ,%d",z,l,m,n);

}

<6>运行以下命令就是我们想要的结果了。下面命令的意思是在当前目录下查找库。-L. 指定库路径   -l 指定库名。注意,在-l时要同时去掉前缀和后缀。


测试目标文件生成后,静态库删掉,程序照样运行。

动态库

我们直接用上面的代码来实现,将lib_a中的.c .h 文件直接拷贝到目录下。


<1>通过gcc -c编译生成.o文件,不过这里要加上-fPIC:产生位置无关码,使它加载到哪里都能运行。


<2>运行以下代码生成动态库。shared:表示生成共享库格式。库的前面加上lib,后缀要加上.so。*.o 表示所有.o文件。


<3>创建一个测试文件,把头文件和动态库拷贝进去。


<4>把之前的main.c拷到当前目录


<5>通过路径和库名生成可执行程序

<6>但在运行的时候是错误的,静态库在编译链接好之后就不需要它了,而动态库在编译链接完之后,加载时依然需要。但是已经找不到了,这里就会出错。


<7>这里就需要引入一个环境变量LD_LIBRARY_PATH,它是系统查找动态库的路径,ldd记录应用程序依赖的动态库。


阅读更多
个人分类: linux
上一篇调研同步与互斥概念原理,了解生产者消费者原理
下一篇模拟实现shell,使它支持重定向功能
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭