Linux C 链接模块

静态链接

在这里插入图片描述

Linux 下静态库的创建和使用

1.编译静态库源码:gcc -c lib.c -o lib.o
2.生成静态库文件:ar -q lib.a lib.o
2.使用静态库编译:gcc main.c lib.a -o main.out

#20-1.c
#include <stdio.h>

extern char* name();
extern int add(int a,int b);

int main()
{
    printf("Name: %s\n",name());
    printf("Result: %d\n",add(2,3));

    return 0;
}
#slib.c
char* name()
{
    return "Static Lib";
}

int add(int a,int b)
{
    return a + b;
}

1.gcc -c slib.c -o slib.o
2.ar -q slib.a slib.o
如果打包成功,会显示:ar: creating slib.a
3.gcc 20-1.c slib.a -o test.out
4…/test.out
这里把 20-1.c slib.a slib.c slib.o 全部删除掉,只留下 test.out ,也不影响运行结果,因为这里属于静态链接。 slib.a slib.c slib.o 这些文件已经全部经过连接器,链接到最终可执行的程序 test.out 中了,test.out 的运行与 slib.a slib.c slib.o 这些文件 没有任何关系了,这点与动态链接是不一样的。静态链接的缺点就是:所占用的内存比较大。

动态链接

在这里插入图片描述

Linux 下动态库的创建和使用

1.编译动态库源码:gcc -shared dlib.c -o dlib.so
2.使用动态库编译:gcc main.c -ldl -o main.out
3.关键系统调用:
3.1 dlopen : 打开动态库文件
3.2 dlsym : 查找动态库中的函数并返回调用地址
3.3 dlclose : 关闭动态库文件

#dlib.c
char* name()
{
    return "Dynamic Lib";
}

int add(int a,int b)
{
    return a+b;
}
#20-2.c
#include <stdio.h>
#include <dlfcn.h>

int main()
{
    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);
    }
    else
    {
        printf("cannot open lib....\n");
    }

    return 0;
}

1.gcc -shared dlib.c -o dlib.so
2.gcc 20-2.c -ldl -o test.out
3. ./test.out
这个时候,如果把 dlib.so 这些文件在当前的目录下删除掉,那么再执行 ./test.out 的话,就会报错。因为这个是动态链接的方式,这个动态库是在程序运行的时候加载到内存中去的,我们的程序运行需要依赖这个动态库。

链接是指将目标文件最终链接为可执行程序
根据链接方式的不同,链接过程可以分为:
1.静态链接:目标文件直接链接进入可执行程序。适用于一些小文件,如果文件很多很大,则很浪费内存。
2.动态链接:在程序启动后才动态加载目标文件。比如:手机上的一些应用程序更新。

posted @ 2022-12-21 20:57  repinkply  阅读(25)  评论(0)    收藏  举报