用gcc生成.a静态库和.so动态库
一、库
库分为静态链接和库动态链接库,作用相似但又有不同。
1. 静态链接库
静态链接库不同于动态链接库,在静态库情况下,函数和数据被编译进一个二进制文件,编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。
linux下的静态链接库是 *.a 文件,与动态链接库 .so 对应。linux下 .a 文件,如果编写了入口函数,也可以直接执行。
Windows下静态链接库是 .lib 文件,与动态链接库 .dll 相对应。
2. 动态链接库
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 文件中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。使用动态链接库可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。
动态链接库文件,是一种不可执行的二进制程序文件,它允许程序共享执行特殊任务所必需的代码和其他资源。Windows 中,DLL 多数情况下是带有 “.dll” 扩展名的文件,但也可能是 ".ocx"或其他扩展名;Linux系统中常常是 “.so” 的文件。它们向运行于 Windows操作系统下的程序提供代码、数据或函数。程序可根据 DLL 文件中的指令打开、启用、查询、禁用和关闭驱动程序。
3.二者差异
静态库在程序编译时会被连接到目标代码之中,程序运行时不需要改静态库。动态库在程序运行时并不会被连接到目标代码中,而是在程序运行时才被载入,因此在程序运行时还需要动态库的存在。
以上库的相关知识取自: Linux系统下利用库生成可执行文件
二、 gcc生成动态库和静态库
1. 用前准备
nano生成例子程序hello.h,hello.c和main.c,此处存于文件夹jingmove(随便取文件名)
分别写入:
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;
}
2. 生成静态库
① 将hello.c编译成.o文件
② 由.o文件创建静态库
③ 在程序中使用静态库