动态库和静态库的概念及创建使用

目录

一、库的概念

二、静态库

2.1 特点

2.2 静态库的制作流程

(1)编写库源码

(2)给库源码编写头文件

(3)编译生成目标文件

(4)创建静态库

(5)编写测试程序test.c s

(6)编译test.c,并链接静态库文件

2.3 静态库文件的命名规范

三、动态库

3.1 特点

3.2 动态库的制作流程

(1)编写库源码

(2)为共享库编写头文件

(3)编译生成目标文件

(4)创建共享库

(5)编写测试程序main.c

(5)编译main.c,并为共享库创建链接文件

3.3 动态库的文件命名规范


一、库的概念

库的本质:是一种可执行代码的二进制形式,可以被操作系统载入内存执行;是别人写好的现有的、成熟的,可以复用的代码

库的类型:静态库和动态库(共享库)

区别:静态库和动态库的区别在于加载程序的时机不同

二、静态库

在程序编译阶段(链接阶段),将库函数的代码以复制拷贝的方式加载到源程序中

2.1 特点

1.占资源空间,文件体积大
2.运行时不需要静态库存在
3.可移植性强
4.优化升级时,需要重新编译源文件

2.2 静态库的制作流程

(1)编写库源码

#include <stdio.h>

void hello(void)
{
	printf("hello world\n");
	return 0;
}

(2)给库源码编写头文件

#ifndef __HELLO_H__
#define __HELLO_H__

void hello(void);

#endi

(3)编译生成目标文件

gcc -c hello.c -o hello.o

此时生成一个 hello.o 文件

(4)创建静态库

ar crs libhello.a hello.o

此时生成一个 libhello.a 文件

(5)编写测试程序test.c s

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

int main(int argc, const char *argv[])
{
	hello();

	return 0;
}

(6)编译test.c,并链接静态库文件

输入命令
gcc main.c -L. -lhello
./a.out

运行结果:
hello!

2.3 静态库文件的命名规范

以lib开头,以.a结尾,中间为库名
    libhello.a->libhello.a == 库文件名
    hello == 库名

三、动态库

在程序编译阶段,只是将需要用到的函数做一个记录,最后在程序运行阶段再加载需要用到的函数

3.1 特点

1.不占资源空间,编译之后可执行文件比较小
2.运行时需要动态库存在
3.可移植性差
4.优化升级比较方便,不需要重新编译源文件

3.2 动态库的制作流程

1.先预留接口口函数
2.实现所有函数功能
3.将所有的.c文件生成对应的目标文件
    gcc -c -fPIC hello.c -o hello.o
    -fPIC--表示生成位置无关代码
4.编译生成动态库
    gcc -shared -o libhello.so hello.o

(1)编写库源码

#include <stdio.h>

void hello(void)
{
	printf("hello world\n");
	return 0;
}

(2)为共享库编写头文件

#ifndef __HELLO_H__
#define __HELLO_H__

void hello(void);

#endi

(3)编译生成目标文件

gcc -c -fPIC hello.c

此时生成一个 hello.o 文件

(4)创建共享库

gcc -shared -o libhello.so *.o
生成动态库文件 libhello.so

-shared:告诉编译器生成一个共享库

libhello.so:生成的共享库的文件名叫“libhello.so”,其中,“.so” 表示这是一个共享库

(5)编写测试程序main.c

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

int main(int argc, const char *argv[])
{
	hello();

	return 0;
}

(5)编译main.c,并为共享库创建链接文件

输入命令
gcc main.c -L. -lhello
./a.out

可以发现此处共享库和静态库用法相同;GCC在链接时首先找共享库,如果共享库不存在,则链接静态库,如果静态库也找不到,则报错;加"-static"选项后,编译器会直接去找静态库。
执行时出错原因:因为程序链接的是共享库,并没有复制共享库中的代码,程序在执行时还会去加载用到的共享库,在加载的时候回去缺省的路径(比如"/lib","/usr/lib")下去寻找共享库,但是我们创建的库在当前目录下,并不在系统库的搜索路径里,所以在执行的时候找不到共享库就报错了;
创建好共享库后还需要添加共享库加载路径

为了让执行程序顺利找到动态库,有三种方法:

(1)把库拷贝到/usr/lib和/lib目录下再执行(一般放置系统配置文件,不推荐使用)

sudo cp libhello.so /lib

(2)在LD_LIBRARY_PATH环境变量中加上库所在路径(只对当前shell有效,即是临时的,不推荐使用)

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. linux@linux:~/test/stdio/share_library$ ./test.out

export:将原来的环境变量导出;

“:“前面”$LD_LIBRARY_PATH"是引用原先的值;”:“后面的”.“是追加了当前目录;还可以追加其余共享库的路径,要用”:"隔开

此方法是临时的,只对当前终端有效。当重新打开一个终端再执行改程序时又会报错

(3)添加/etc/ld.so.conf.d/*.conf文件,把库所在的路径添加到文件末尾,并执行ldconfig刷新(永久添加)

cd /etc/

cd /ld.so.conf.d/ --- 转到该目录下

sudo vim my.conf --- 添加配置文件,在/etc/ld.so.conf.d/目录下创建my.conf文件

/home/IO/shared_lib --- 在配置文件中添加路径

sudo ldconfig --- 刷新

ldconfig 会读取这个目录下所有的配置文件,把配置文件路径中的库的所有信息提取出来

3.3 动态库的文件命名规范

以lib开头,以.so结尾,中间为库名
    libhello.so->libhello.so == 库文件名
    hello == 库名

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值