静态库的制作:

Lib.h

#ifndef LIB_H
#define LIB_H
void show();
#endif

Lib.c

#include "Lib.h"
#include <stdio.h>
void show() {
printf("Hello Wrold!\n");
}

Program.c

#include "Lib.h"
int main() {
show();
return 0;
}

首先将Lib.c编译成Lib.o

gcc -c Lib.c -o Lib.o

Linux 静态库和动态库的制作_可执行文件


然后将Lib.o打包为静态库

ar crs -o mylib.a Lib.o

Linux 静态库和动态库的制作_动态链接_02


然后生成可执行文件StaticProgram1

gcc Program.c mylib.a -o StaticProgram1

Linux 静态库和动态库的制作_#include_03


最后执行StaticProgram1

./StaticProgram1

Linux 静态库和动态库的制作_可执行文件_04

动态库制作:
先生成Lib.so动态文件

gcc -fPIC -shared -o Lib.so Lib.c

Linux 静态库和动态库的制作_c语言_05

然后生成DLLProgram1文件

gcc Program.c ./Lib.so -o DLLProgram1

Linux 静态库和动态库的制作_c语言_06


最后执行

./DLLProgram1

Linux 静态库和动态库的制作_可执行文件_07


从上述结果来看,静态链接和动态链接并没有什么区别。现在让我从其他角度来看看他们之间的区别。

静态链接的可执行文件比动态链接的可执行文件的占用空间更大。StaticProgram1 的 所占字节大小16760 Byte

Linux 静态库和动态库的制作_c语言_08


DLLProgram1 的 所占字节大小16688 Byte

Linux 静态库和动态库的制作_动态链接_09


DLLProgram1所占字节数量小于StaticProgram1

静态链接的可执行文件若需要修改,则需要修改一个模块后,所有目标文件重新编译。
动态链接的可执行文件若需要修改,则仅需要修改动态链接所涉及的一个模块即可,不需要重新编译生成新的可执行文件,只需要将动态链接文件重新编译即可。

示例:
Lib.c

#include "Lib.h"
#include <stdio.h>
void show() {
printf("Hello Wrold!\n");
printf("Hello Wrold!\n");
}

重新生成Lib.so

Linux 静态库和动态库的制作_可执行文件_10


执行./DLLProgram1

Linux 静态库和动态库的制作_动态链接_11