目录
一、Linux系统中函数库的类型
函数库分为静态库和动态库。
- 静态库
在程序编译时会被连接到目标代码中,程序运行是则不需要静态库的存在。 - 动态库
在程序编译时不会被连接到目标代码中,而是程序运行时载入的。
两者区别:前者是编译连接的,后者是程序运行载入的。
二、hello实例使用库
(一)、准备步骤
1.创建一个作业目录test1,保存本次练习文件。
mkdir test1
cd test1
2.hello代码 ,使用gedit文本编辑器生成hello.c,hello.h,main.c三个文件,三个文件源代码如下
程序一: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;
}
3.将 hello.c 编译成.o 文件并观察是否编译成功
gcc -c hello.c
ls
4.由.o 文件创建静态库并观察
创建静态库的工具:ar
静态库文件命名规范:以lib作为前缀,是.a文件
ar -crv libmyhello.a hello.o
ls
(二)、静态库使用
1.含这些公用函数的原型声明,然后在用 gcc 命令生成目标文件时指明静态库名,gcc 将会从 静态库中将公用函数连接到目标文件中。注意,gcc 会在静态库名前加上前缀 lib,然后追 加扩展名.a 得到的静态库文件名来查找静态库文件。
方法一:
gcc -o hello main.c -L. –lmyhello
方法二:
gcc main.c libmyhello.a -o hello
方法三:
先生成 main.o,再生成可执行文件
gcc -c main.c
gcc -o hello main.o libmyhello.a
本次采用的是方法三,操作结果为:
2.验证静态库是否生成成功
打开文件
./hello
删除静态库文件试试公用函数 hello 是否真的连接到
rm libmyhello.a
3.通过观察发现程序照常运行,证明表明静态库跟程序执行没有联系以及静态库中的公用函数是在编译过程中直接被调用的。
(三)、动态库使用
1.创建动态库
创建动态库的工具:gcc
动态库文件命名规范:以lib作为前缀,是.so文件
gcc -shared -fPIC -o libmyhello.so hello.o
shared:表示指定生成动态链接库,不可省略
-fPIC:表示编译为位置独立的代码,不可省略
gcc -shared -fPIC -o libmyhello.so hello.o
ls
2.在程序中使用动态库
输入命令gcc main.c libmyhello.so -o hello 或