0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux下动态库和静态库制作与调用

嵌入式技术 来源:嵌入式技术 作者:嵌入式技术 2022-08-24 15:03 次阅读

Linux下动态库和静态库制作与调用

1.动态库和静态库简介

静态库是指在应用中,有一些公共代码需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中。这种库称为其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。

动态库又称动态链接库英文为DLL,是指DynamicLinkLibrary 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数

静态库:在编译的时候加载生成目标文件,在运行时不用加载库,在运行时对库没有依赖性。

动态库:在目标文件运行时加载,对库有依赖性。

 1.1 Linux下动态库和静态库命令方式
  动态库命名方式:libxxx.so。其中so是shared objecd的缩写,即可以共享的目标文件,lib为库的固定格式,xxx为库名称,.so为动态库后缀。
  动态库命名方式:libxxx.a xxx静态库名称。Linux 上的静态库,其实是目标文件的归档文件。

 1.2 编译生成共享库示例

 命令:gcc -fPIC -shared -o libxxx.so xxx.c
此过程分为编译和链接两部分,-fPIC是编译选项,PIC表示要生成位置无关的代码,这是动态库的特性,-shared是链接选项,告诉gcc生成动态库而不是可执行文件。
上述命令等同于:
gcc -fPIC -c xxx.c
gcc -shared -o libxxx.so xxx.o
如下代码为例实现动态库编译与调用:

pYYBAGMFzSWABhxDAABqunGIh3g098.png#pic_center
[wbyq@wbyq shared]$ gcc -fPIC -shared -o libmyfile.so ./src/*.c -I./include

  gcc -I  指定头文路径

 1.3 动态库调用

[wbyq@wbyq shared]$ gcc main.c -Iinclude -lmyfile -L./lib

 gcc -L  指定动态库路径
 gcc -l  指定动态库名字

 1.4 程序运行

[wbyq@wbyq shared]$ ./a.out 
./a.out: error while loading shared libraries: libmyfile.so: cannot open shared object file: No such file or directory

  错误原因:
  系统动态库默认搜索路径: /lib 和 /usr/lib
  解决办法1:将libmyfile.so 拷贝到/usr/lib或者/lib目录下。
  解决办法2:修改系统环境变量,动态库环境变量:LD_LIBRARY_PATH
  修改环境变量示例:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/hgfs/ubuntu/shared/lib

  注意:在命令行修改环境变量只对当前终端有效。
  解决办法2:修改系统启动文件
  Ubuntu下开机普通用户启动文件:~/.bashrc ~/.profile
  管理员用户:/.profile
  修改~/.bashrc文件:

poYBAGMFzSaAaj0MAAKWKfbkgFg449.png#pic_center

  同步文件:source ~/.bashrc

2 linux静态库创建与调用

 2.1 linux静态库的命令规则

  静态库libxxx.a   xxx静态库名称。Linux 上的静态库,其实是目标文件的归档文件。

 2.2 linux静态库创建步骤

  (1)编写源文件,通过gcc -c生成目标文件。
  (2)用ar归档目标文件,生成静态库。
  (3)配合静态库,写一个使用静态库中函数的头文件。
  (4).使用静态库时,在源码中包含对应头文件,链接是记得链接自己的库。

 2.3 生成静态库

[wbyq@wbyq shared]$ ar t ./lib/libmyfile2.a  #查看静态库信息
my_cat.o
my_cp.o
my_du.o
[wbyq@wbyq shared]$ gcc main.c -L./lib -lmyfile2 -o app -Iinclude #调用静态

3.gcc编译器常用选项

 3.1 gcc基本用法

  使用 gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。 GCC 编译器的调用参数大约有100 多个,这里只介绍其中最基本、最常用的参数。
  gcc 最基本用法:gcc [参数] [文件名称]

3.2 常用参数

-c 只编译:不链接成为可执行文件,编译器只是由输入的.c 等源代码文件生成.o 为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
-o output_filename:确定输出文件的名称为 output_filename,同时这个名称不能和源文件同名。如果不给出这个选项, gcc 就给出预设的可执行文件 a.out。
-g:产生符号调试工具(GNU 的 gdb)所必要的符号信息,要想对源代码进行调试,我们就必须加入这个选项。
-O:对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、链接的速度就相应地要慢一些。
-O2:比-O 更好的优化编译、链接,当然整个编译、链接过程会更慢。
-E:仅执行编译预处理;
-S:将 C 代码转换为汇编代码;

3.3 编译时指定库文件和头文件路径

-L:指定动态库路径(可以指定多个路径)。
示例: gcc test.c -o app -L/usr/lib -L ./lib
 -I:指定头文件存放的路径(可以指定多个路径)。
示例: gcc test.c -I ./ -I /include
 -l:指定库名称(可以指定多个路径)。
示例: gcc test.c -l my_test -l func

4.linux下采用dlopen调用动态库

4.1 dlopen调用动态库意义

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

 4.2 dlopen系列函数介绍

#include 
void *dlopen(const char *filename, int flags);
函数功能:打开动态库
形参:filename --动态库路径+名字 例:./lib/libmyfile.so
   flags --RTLD_LAZY使用时解析(暂缓解析)
   RTLD_NOW --立刻解析
返回值: handle --成功返回库引用信息,失败返回NULL
int dlclose(void *handle);
函数功能:关闭动态库
形参:handle --dlopen函数返回值
void *dlsym(void handle, const charsymbol);
函数功能:符号解析
形参:handle --dlopen函数返回值
   symbol --要解析的符号
返回值:成功返回符号地址,
    失败返回NULL
char *dlerror(void); //打印错误信息

 4.3函数解析示例

#include "./include/my_file.h"
#include 
#include 
int main()
{
    int (*p)(const char *);//定义一个函数指针

    /*打开动态库*/
    void *handle=dlopen("./lib/libmyfile.so",RTLD_LAZY);
    if(handle==NULL)
    {
        printf("动态库解析失败%s\n",dlerror());//打印错误信息
        return 0;
    }
    /*符号解析*/
    p=dlsym(handle,"my_cat");
    int res=p("main.c");
    printf("res=%d\n",res);

    p=dlsym(handle,"my_du");
    p("main.c");
    //typedef unsigned int u32;
    typedef int (*my_cp)(const char *,const char *);//my_cp表示函数指针类型
    my_cp test;//定义函数指针变量
    test=dlsym(handle,"my_cp");
    test("main.c","test.c");

    dlclose(handle);//关闭动态库
}

 4.4变量解析示例

#include "./include/my_file.h"
#include 
#include 
int main()
{
    int (*p)(const char *);//定义一个函数指针
    /*打开动态库*/
    void *handle=dlopen("./lib/libmyfile.so",RTLD_LAZY);
    if(handle==NULL)
    {
        printf("动态库解析失败%s\n",dlerror());//打印错误信息
        return 0;
    }
    /*符号解析*/
    p=dlsym(handle,"my_du");
    p("main.c");
    printf("-----------------------------------\n");
    /*解析变量*/
    int *p2;
    p2=dlsym(handle,"data");
    printf("*p2=%d\n",*p2);
    *p2=300;
    p("main.c");
    dlclose(handle);//关闭动态库
}


审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10994

    浏览量

    206772
  • 静态库
    +关注

    关注

    0

    文章

    21

    浏览量

    7387
  • 动态库
    +关注

    关注

    0

    文章

    16

    浏览量

    6194
收藏 人收藏

    评论

    相关推荐

    动态子VI和静态子VI,调用子VI函数

    请问动态子VI和静态子VI的区别,通过引用调用VI和调用子VI函数的区别,谢谢。
    发表于 01-02 16:04

    Linux系统动态静态库函数的使用介绍

    一个标记指明当程序执行时,首先必须载入这个。由于动态节省空间,linux进行连接的缺省操作是首先连接
    发表于 04-02 16:21

    动态和静态的区别

    一、什么是本质上来说库是一种可执行代码的二进制形式,可以***作系统载入内存执行。二、的种类linux有两种:
    发表于 05-26 17:22

    Linux系统动态静态库函数的使用介绍

    程序内留下一个标记指明当程序执行时,首先必须载入这个。由于动态节省空间,linux进行连接的缺省操作是首先连接
    发表于 09-29 11:31

    Linux动态和静态制作及使用

    不必从零开始,我们要做的只是在恰当的位置调用合适的库函数去实现相应的功能,充分利用前人的劳动成果,就是“站在巨人的肩膀上”。本文主要简述Linux
    发表于 11-18 17:05

    Linux系统动态静态库函数的使用介绍

    了。然而,对动态而言,就不是这样。动态会在执行程序内留下一个标记指明当程序执行时,首先必须载入这个。由于
    发表于 07-04 05:33

    linux Qt 动态制作以及使用方法

    一、Qt动态制作 (1)、新建 选择目录选择需要的模块,如果需要界面则选择QtGui等。(2)、编写简单代码以及编译编写简单的打印代码,然后点击运行,之后弹出如下窗口:点击“取消”,之后可在工程
    发表于 07-05 08:01

    Linux静态动态制作与使用

    什么是静态函数库动态函数库又是什么?linux静态函数库是怎样创建并使用的?动态函数库是怎样创建并使用的?
    发表于 04-26 06:45

    如何制作一个Linux动态

    以下主要介绍Linux 动态静态、如何使用已有的动态
    发表于 11-04 06:58

    应用程序所依赖的动态和静态没有调试信息的原因

    的原因可能有这么几个:应用程序在编译时没有指定-g选项,导致可执行程序没有调试信息。应用程序所依赖的动态和静态没有调试信息。应用程序的运行时环境没有调试信息,比如libc等。嵌入式
    发表于 11-05 06:41

    静态动态的相关知识

    静态动态笔记系列嵌入式系统方向学习笔记1嵌入式系统方向学习笔记2文章目录静态
    发表于 12-22 07:49

    静态动态的使用

    是一种可执行的二进制文件,是编译好的代码。使用可以提高开发效率。在 Linux 下有静态动态
    发表于 05-04 14:08

    Linux静态库和动态库(共享库)的制作与使用

    Linux静态库和动态库(共享库)的制作与使用Linux
    发表于 07-09 14:39 1047次阅读

    讲解Linux虚拟机之使用动态和静态

    了解 Linux 如何使用库,包括静态库和动态库的差别,有助于你解决依赖问题。
    发表于 05-06 17:05 1892次阅读
    讲解<b class='flag-5'>Linux</b>虚拟机之使用<b class='flag-5'>动态</b>库<b class='flag-5'>和静态</b>库

    嵌入式Linux动态和静态库使用

    以下主要介绍Linux动态库、静态库、如何使用已有的动态库, 以及如何制作一个动态库。
    发表于 11-01 16:57 1次下载
    嵌入式<b class='flag-5'>Linux</b>下<b class='flag-5'>动态</b>库<b class='flag-5'>和静态</b>库使用