静态库的制作:
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
然后将Lib.o打包为静态库
ar crs -o mylib.a Lib.o
然后生成可执行文件StaticProgram1
gcc Program.c mylib.a -o StaticProgram1
最后执行StaticProgram1
./StaticProgram1
动态库制作:
先生成Lib.so动态文件
gcc -fPIC -shared -o Lib.so Lib.c
然后生成DLLProgram1文件
gcc Program.c ./Lib.so -o DLLProgram1
最后执行
./DLLProgram1
从上述结果来看,静态链接和动态链接并没有什么区别。现在让我从其他角度来看看他们之间的区别。
静态链接的可执行文件比动态链接的可执行文件的占用空间更大。
StaticProgram1 的 所占字节大小16760 Byte
DLLProgram1 的 所占字节大小16688 Byte
DLLProgram1所占字节数量小于StaticProgram1
静态链接的可执行文件若需要修改,则需要修改一个模块后,所有目标文件重新编译。
动态链接的可执行文件若需要修改,则仅需要修改动态链接所涉及的一个模块即可,不需要重新编译生成新的可执行文件,只需要将动态链接文件重新编译即可。
示例:
Lib.c
#include "Lib.h"
#include <stdio.h>
void show() {
printf("Hello Wrold!\n");
printf("Hello Wrold!\n");
}
重新生成Lib.so
执行./DLLProgram1