前言
本文对动态链接进行一个初步的介绍,内容来源于《程序员的自我修养》
正文
动态链接介绍
动态链接基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将他们链接在一起形成一个完整的程序。
Linux系统中,动态链接文件以".so"为扩展名,so
表示Shared Objects,称为动态共享对象。
Windows系统中,动态链接文件以".dll"为扩展名,dll
表示Dynamic Linking Library,称为动态链接库。
为什么要动态链接
1、节省空间
如果Program1和Program2都用到模块Lib,静态链接的方式同时运行Program1和Program2时内存中会有两份Lib,动态链接的方式则只有一份。
2、便于更新
如果有一个模块需要更新,静态链接需要更新整个程序,动态链接只需要更新相应的模块。
3、扩展性和兼容性
可以动态地载入各种由第三方开发的模块。
一个程序在不同平台运行可以动态地链接到由操作系统提供的动态链接库。
简单的动态链接例子
以下是一个在Linux系统中实现的动态链接例子。
首先创建4个文件夹
touch Program1.c
touch Program2.c
touch Lib.c
touch Lib.h
其中Program1.c内容为
#include "Lib.h"
int main()
{
foobar(1);
return 0;
}
Program2.c为
#include "Lib.h"
int main()
{
foobar(2);
return 0;
}
Lib.c为
#include <stdio.h>
void foobar(int i)
{
printf("Printing from Lib.so %d\n", i);
}
Lib.h为
#ifndef LIB_H
#define LIB_H
void foobar(int i);
#endif
接下来编译Lib.c生成一个共享对象文件,命令如下:
gcc -fPIC -shared -o Lib.so Lib.c
-shared
表示产生共享对象,-fPIC
表示使用地址无关(Position-independent Code)。
然后分别编译Program1和Program2,:
gcc -o Program1 Program1.c ./Lib.so
gcc -o Program2 Program2.c ./Lib.so
可以看到此时路径下文件内容如下:
运行Program1和Program2