用GCC生成静态库和动态库

一.静态库与动态库

1.静态库

静态是指每个用到该库的应用程序都会将该库拷贝到自己的目标代码中,程序运行是则不需要静态库的存在,因此利用静态库生成的文件比较大。
命名:lib****.a

2.动态库

动态库又名共享库,在编译时并没有将该库带进目标代码中,当程序执行到相关函数时才调用该库,因此使用这类库生成的文件会比较小。动态库的改变并不会影响你自己的程序,因此动态库的升级比较方便。除此之外,动态库有一个最显著的特点就是:当多个程序调用同个共享库时,内存中只有一个动态库实例。
命名: lib****.so

3.两者区别

前者是编译连接的,后者是程序运行载入的。
linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib

二.库的生成与使用

(一)准备代码

hello.h

#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif//HELLO_H

hello.c

#include<stdio.h>
void hello(const char *name)
{
	printf("Hello %s\n",name);
}

main.c

#include"hello.h"
int main()
{
	hello("everyone");
	return 0;
}

gcc编译得到.o文件
在这里插入图片描述cd:进入目录文件;
gedit:进入文本编辑器;
ls:查看当前目录下的子文件

(二) 创建静态库

静态库文件名的命名规范是以 lib 为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将 创建的静态库名为myhello,则静态库文件名就是libmyhello.a。在创建和使用静态库时, 需要注意这点。创建静态库用 ar 命令。在系统提示符下键入以下命令将创建静态库文件libmyhello.a。

1.生成静态库.a文件

在这里插入图片描述

2. 程序中使用静态库

方式一:
gcc -o hello main.c -L. -lmyhello
在这里插入图片描述方式二:
gcc main.c libmyhello.a -o hello
在这里插入图片描述方式三:
先生成main.o,再生成可执行文件libmyhello.a
gcc -c main.c 或
gcc -o hello main.c libmyhello.a
在这里插入图片描述

3.验证静态库的特点

可以看到我们执行了rm命令之后(注意rm删除的文件不可恢复,谨慎使用),文件中没有了静态库libsub.a,但sub程序依旧可以得出结果,说明在编译链接时,静态库直接链接到程序之中,程序在运行时不需要再访问静态库。

(三) 创建动态库

动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀 lib,但其 文件扩展名为.so。例如:我们将创建的动态库名为myhello,则动态库文件名就是 libmyhello.so。用 gcc 来创建动态库。 在系统提示符下键入以下命令得到动态库文件 libmyhello.so。

1. 生成动态库.so文件

gcc -shared -fPIC -o libmyhello.so hello.o

在这里插入图片描述shared:表示指定生成动态链接库,不可省略;
-fPIC:表示编译为位置独立的代码,不可省略;

2. 程序中使用动态库

gcc -o hello main.c -L. -lmyhello

再运行可执行文件hello,会出现错误
在这里插入图片描述
解决方法:将libmyhello.so复制到目录/usr/lib中。由于运行时,是在/usr/lib中找库文件的。

sudo mv libmyhello.so /usr/lib

在这里插入图片描述

(四) 静态库与动态库编译的比较

gcc编译得到.o文件 gcc -c hello.c
创建静态库 ar -crv libmyhello.a hello.o
创建动态库 gcc -shared -fPIC -o libmyhello.so hello.o
使用库生成可执行文件 gcc -o hello main.c -L. -lmyhello
执行可执行文件 ./hello
在执行可执行文件,会报一个错误,可见当静态库和动态库同时存在的时候,程序会优先使用动态库。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值