c语言学习笔记--动态库和静态库的使用

CrazyDiode CrazyDiode     2022-08-06     265

关键词:

1.C语言中的链接器

 

1)每个 C 语言源文件被编译后生成目标文件,这些目标文件最终要被链接在一起生成可执行文件。 

2)链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。 

技术分享

2.静态链接

由链接器在链接时将库的内容直接加入到可执行程序中

技术分享

 

编译静态库源码:gcc –c lib.c –o lib.o

生成静态库文件:ar –q lib.a lib.o //lib.o 与其他文件打包到 lib.a

使用静态库编译:gcc main.c lib.a –o main.out

3.动态链接

可执行程序在运行时才动态加载库进行链接 ,库的内容不会进入可执行程序当中

技术分享

 

编译动态库源码:gcc –shared dlib.c –o dlib.so

使用动态库编译:gcc main.c -ldl –o main.out

 

4.dlopen、dlsym、dlclose使用动态库

为了使程序方便扩展,具备通用性,可以采用插件形式。采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件。linux提供了加载和处理动态链接库的系统调用,非常方便。 

打开动态库:dlopen

查找动态库中的函数并返回调用地址:dlsym

 

关闭动态库:dlclose

dlib.c

 

char* name()
{
    return "Dynamic Lib";
}
int add(int a, int b)
{
    return a + b;
}

test.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
", pname());
            printf("Result: %d
", padd(2, 3));
        }
        //关闭动态库
        dlclose(pdlib);
    }
    else
    {
        printf("Cannot open lib ...
");
    }
    return 0;
}

 

gcc -shared dlib.c -o dlib.so

gcc test.c -o test.o -ldl

 

静态函数库的制作和使用

...时,函数库加载时机的差异,将函数库分为静态函数库和动态函数库,具体差异是:C语言程序如果使用静态函数库的函数,那么整个函数库的代码都会和C语言程序一起编译成可执行代码,程序的体积会膨胀;如果使用动态函数... 查看详情

linux下c/c++编程开发静态库和动态库(代码片段)

...、静态库2.1命名规则2.2静态库的制作2.3静态库的使用三、动态库3.1命名规则3.2动态库的制作3.3动态库的使用3.3.1修改环境变量3.3.2修改/etc/ld.so.cache文件列表3.3.3/lib或/usr/lib目录四、动静态库的优缺点4.1静态库4.2动态库前言下面的... 查看详情

linux下c/c++编程开发静态库和动态库(代码片段)

...、静态库2.1命名规则2.2静态库的制作2.3静态库的使用三、动态库3.1命名规则3.2动态库的制作3.3动态库的使用3.3.1修改环境变量3.3.2修改/etc/ld.so.cache文件列表3.3.3/lib或/usr/lib目录四、动静态库的优缺点4.1静态库4.2动态库前言下面的... 查看详情

静态库和动态库同时链接

...序需要链接外部库的情况下,linux默认对库的链接是使用动态库,在找不到动态库的情况下再选择静态库。当动态库与静态库混合链接时,使用-static会导致所有的库都使用静态链接的方式,这时就需要-Wl的方式: gcc–otest... 查看详情

cgo静态库和动态库(代码片段)

CGO静态库和动态库CGO在使用C/C++资源的时候一般有三种形式:直接使用源码;链接静态库;链接动态库。直接使用源码就是在import"C"之前的注释部分包含C代码,或者在当前包中包含C/C++源文件。链接静态库和动态库的方式... 查看详情

详解linux下静态库/动态库的生成和使用(含代码示例和操作流程)&&动态库和静态库的区别(代码片段)

文章目录一、库的概念Windows的库Linux的库二、动态库和静态库的区别1.载入顺序不同2.大小与共享的差异3.库函数调用的差异三、静态库的创建和使用1.创建静态库的步骤:(一)ar命令的使用方法(二)生成静... 查看详情

《c语言杂记》静态库和动态库(linux版)(代码片段)

1静态库和动态库概述库是一种软件组件技术,库里面封装了数据和函数。库的使用可以使程序模块化。库有两种:静态库和动态库。Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件)。Linux通... 查看详情

《c语言杂记》静态库和动态库(linux版)(代码片段)

1静态库和动态库概述库是一种软件组件技术,库里面封装了数据和函数。库的使用可以使程序模块化。库有两种:静态库和动态库。Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件)。Linux通... 查看详情

静态库和动态库的使用

...件名"@2预处理加载静态库#pragmacomment(lib,"库文件名")2.再看动态库@1首先得有动态库文件,将动态库文件放在源码目录(不然后面加载得传入文件路径),这是我的动态库源文件内容1#include<stdio.h>2#include<stdlib.h>3#include<windo 查看详情

使用 cmake 如何静态链接一些库和动态链接其他库?

】使用cmake如何静态链接一些库和动态链接其他库?【英文标题】:withcmakehowtolinksomelibsstaticallyandothersdynamically?【发布时间】:2013-06-1816:52:02【问题描述】:如何告诉CMake静态链接一些库和动态链接其他库?我想编译一个静态链... 查看详情

linux静态库和共享(动态)库的创建与使用详解(代码片段)

文章目录Linux静态库和共享(动态)库库的介绍使用库有什么好处库制作完成后,如何给用户使用静态库(staticlibrary)静态库的制作ar工具创建lib过程静态库的使用源代码静态库的优缺点优点:缺点:共享库... 查看详情

windows系统下静态库和动态库的使用方法

...件)中添加头文件和#pragmacomment(lib,"静态库的路径")使用动态库时,我们需要别人提供的头文件,引入库和动态库,然后在自己的工程的源文件(.cpp文件)中添加头文件和#pragmacomment(lib,"引入库路径") 查看详情

c语言里面的动态库和静态库

...缩打包后形成的一个文件。静态库特点总结:为什么需要动态库,其实也是静态库的特点导致。动态库特点总结:生成动态库 查看详情

gcc编译使用动态链接库和静态链接库(代码片段)

1库的分类根据链接时期的不同,库又有静态库和动态库之分。静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。有别于静态... 查看详情

动态库和静态库的区别

参考技术A函数库分为静态库和动态库两种。 查看详情

linux下c/c++编程开发静态库和动态库(代码片段)

...、静态库2.1命名规则2.2静态库的制作2.3静态库的使用三、动态库3.1命名规则3.2动态库的制作3.3动态库的使用3.3.1修改环境变量3.3.2修改/etc/ld.so.cache文件列表3.3.3/lib或/usr/lib目录四、动静态库的优缺点4.1静态库4.2动态库前言下面的... 查看详情

动态库和静态库(代码片段)

...动静态库动静态库各自特点静态库的打包和使用打包使用动态库的打包与使用使用动静态库的基本原理我们知道从源文件到可执行程序需要如下经历4个步骤预处理:完成头文件展开、去注释、宏替换、条件编译等,形成x... 查看详情

linux动态库和静态库(代码片段)

...静态库动静态库各自的特征静态库的打包与使用打包使用动态库的打包与使用打包使用动静态库的基本原理动静态库的本质是可执行程序的“半成品”。我们都知道,一堆源文件和头文件最终变成一个可执行程序需要经历以... 查看详情