函数库区分为静态库和动态库,静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要该静态库;
动态库在程序编译时并不会被链接到目标代码中,在程序运行时才能被载入,因此程序运行时还需要动态库的存在;
举例:在linux中如何创建静态库和动态库,以及使用它们
在创建函数库之前,我们先准备用例源程序,并将源程序编译成.o文件
第一步:编辑举例的程序hello.h、hello.o和main.c
程序1 :hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif //HELLO_H
程序2:hello.c
#include<stdio.h>
#include "hello.h"
void hello(const char *name)
{
printf("Hello %s!\n", name);
}
程序3: main.c
#include <stdio.h>
#include "hello.h"
int main()
{
hello("everyone");
return 0;
}
第二步:将hello.c编译成.o文件
注:无论静态库还是动态库,都是由.o文件创建的,因此我们必须将源程序hello.c通过gcc先编译生成.o文件
在系统提示符下输入以下命令得到hello.o文件。
gcc -c hello.c
查看是否生成了hello.o文件
[37000@yanfa211 MyHello]$ ls
hello.c hello.h hello.o main.c
第三步:由.o 文件创建静态库
静态库文件命名规范是以lib为前缀,紧跟着静态库名,扩展名为.a。例如:我们将创建的静态库名为myhello,则静态库文件名就是libmyhello.a在创建和使用讲台库时,需要注意这点。创建静态库用ar命令。
在系统提示符下键入以下命令创建静态库文件libmyhello.a。
[37000@yanfa211 MyHello]$ ar cr libmyhello.a hello.o
我们同样运行ls命令查看结果:
hello.c hello.h hello.o libmyhello.a main.c
已经有libmyhello.a即已经生成静态库。
第四步:在程序中使用静态库
静态库制作完了,如何使用内部函数呢?只需要在使用到公用函数的源程序中包含这些公用函数库的原型声明,然后在gcc命令生成目标文件是指明静态库名,gcc将会从静态库中将公用函数链接到目标文件中。注意gcc会静态库名前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件。
在程序3:main中我们包含了静态库文件hello.h,然后在主程序main中直接调用公用函数hello。下面生成目标程序hello,同时运行hello程序看结果如何。
gcc -o hello main.c -L. –lmyhello
[37000@yanfa211 MyHello]$ gcc -o hello main.c -L. -lmyhello
[37000@yanfa211 MyHello]$ ./hello
Hello everyone!
删除静态库文件试试公用函数hello是否真的链接到目标文件hello中了
[37000@yanfa211 MyHello]$ rm -r libmyhello.a
[37000@yanfa211 MyHello]$ ./hello
Hello everyone!
动态库:
第五步:由.o文件创建动态库文件
动态库命名规范和静态库命名规范类似,也就是在动态库名前加前缀lib,但扩展名为.so。例如:我们将创建的动态库名为myhello,则动态文件就是libmyhello.so。用gcc来创建动态库。
在系统提示符下键入以下命令得到动态库文件libmyhello.so
[37000@yanfa211 MyHello]$ gcc hello.c -o hello.o -c -fPIC
[37000@yanfa211 MyHello]$ ls
hello.c hello.h hello.o main.c
[37000@yanfa211 MyHello]$ gcc hello.o -shared -o libMyhello.so
[37000@yanfa211 MyHello]$ ls
hello.c hello.h hello.o libMyhello.so main.c