本文均来自狄泰软件学院
链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接
静态链接
由链接器在链接时将库的内容直接加入到可执行程序中
Linux下静态库的创建和使用
编译静态库源码:gcc -c lib.c -o lib.o
生成静态库文件:ar -q lib.a lib.o
使用静态库编译:gcc main.c lib.a -o main.out
动态链接
可执行程序在运行时才动态加载库进行链接
库的内容不会进入可执行程序当中
Linux下动态库的创建和使用
编译动态库源码:gcc -shared dlib.c -o dlib.so
使用动态库编译:gcc main.c -ldl -o main.out
关键系统调用
dlopen:打开动态库文件
dlsym:查找动态库中的函数并返回调用地址
dlclose:关闭动态库文件
void* pdlib = dlopen("./dlib.so",RTLD_LAZY);
char* (*pname) ();
int (*padd) (int,int)
if (pdlib!=NULL)
{
pname = dlsym(pdlib,"name");
padd = dlsym(pdlib,"add");
if ( (pname!=NULL) && (padd!=NULL) )
{
printf("Name:%s\n",pname());
printf("Result:%d\n",padd(2,3));
}
dlclose(pdlib);
}
链接是指将目标文件最终链接为可执行程序
根据链接方式的不同,链接过程可以分为:
静态链接:目标文件直接链接进入可执行程序
动态链接:在程序启动后才动态加载目标文件