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

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

3天内不再提示

谈一下动态库的构建

冬至子 来源:计算机科学实验室 作者:好坏生长 2023-01-18 11:13 次阅读

在前面介绍了静态库的构建,这里谈一下动态库的构建,同样以案例的方式描述,希望案例可起到模板的作用。

首先新建一个测试文件,test.c

#include 


int main()
{
  printf("hello world\\n");


  return 0;
}

它是可以编译成功的

2.jpg

将可执行文件a.out删除

2.jpg

添加文件,如静态库中所示(这里省略掉了)

2.jpg

编译运行,同样可以输出

$ gcc test.c func.c
:~/Documents/clan/test2$ tree
.
├── a.out
├── func.c
├── func.h
└── test.c


0 directories, 4 files
:~/Documents/clan/test2$ ./a.out 
hello world
30

到此说明,所有文件是正常的,程序是正常的。

下面清除a.out文件,用动态库的方式实现。

: ~/Documents/clan/test2$ gcc test.c func.c

:~ /Documents/clan/test2$ tree

.

├── a.out

├── func.c

├── func.h

└── test.c

0 directories, 4 files

: ~/Documents/clan/test2$ ./a.out

hello world

30

:~ /Documents/clan/test2$ rm a.out

:~/Documents/clan/test2$ tree

.

├── func.c

├── func.h

└── test.c

0 directories, 3 files

: ~/Documents/clan/test2$ gcc -fPIC -shared -o libfunc.so func.c

:~ /Documents/clan/test2$ tree

.

├── func.c

├── func.h

├── libfunc.so

└── test.c

0 directories, 4 files

: ~/Documents/clan/test2$ gcc test.c libfunc.so

:~ /Documents/clan/test2$ tree

.

├── a.out

├── func.c

├── func.h

├── libfunc.so

└── test.c

0 directories, 5 files

:~/Documents/clan/test2$ ./a.out

./a.out: error while loading shared libraries: libfunc.so: cannot open shared o

2.jpg

`

很可惜,最后在链接动态库编译的时候,失败了,提示不能找到文件

error while loading shared libraries: libfunc.so: cannot open shared object file: No such file or directory

在编译程序时,使用动态链接库和静态库是一致的,使用”-l库名”的方式,在生成可执行文件的时候会链接库文件。

-L指定动态链接库的路径,-ldtiger链接库函数tiger。-ltiger是动态库的调用规则。Linux系统下的动态库命名方式是lib*.so,而在链接时表示位-l*,*是自己命名的库名。

:~/Documents/clan/test2$ rm a.out 
:~/Documents/clan/test2$ gcc test.c -L./ -lfunc
:~/Documents/clan/test2$ tree
.
├── a.out
├── func.c
├── func.h
├── libfunc.so
└── test.c


0 directories, 5 files
:~/Documents/clan/test2$ ./a.out 
./a.out: error while loading shared libraries: libfunc.so: cannot open shared object file: No such file or directory

错误是因为程序运行时没有找到动态链接库造成的。程序编译时链接动态库和运行时使用动态链接库的概念是不同的,在运行时,程序链接的动态链接库需要在系统目录下才行。为此,需要设置临时环境变量

:~/Documents/clan/test2$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
:~/Documents/clan/test2$ gcc test.c -L./ -lfunc
:~/Documents/clan/test2$ ./a.out 
hello world
30

其中export LD_LIBRARY_PATH=$LD_LIBRARY_PATH**:**.表示动态库所在位置为当前目录,将当前目录添加到环境变量中,当终端关闭,这个临时变量就会消失。

2.jpg

上面的运行结果显示,可以正确输出结果,也就是说,动态库是可以成功链接的。下面将上述案例稍微变复杂一点,如果是多个层级目录,又怎么处理,理解路径是非常重要的。

:~/Documents/clan/test2$ tree
.
├── func
│ ├── func.c
│ └── func.h
└── test.c

1 directory, 3 files
:/Documents/clan/test2$ gcc -fPIC -shared -o func/libfunc.so func/func.c
:
/Documents/clan/test2 export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/func
:/Documents/clan/test2$ gcc test.c -L./func -lfunc
:
/Documents/clan/test2$ tree
.
├── a.out
├── func
│ ├── func.c
│ ├── func.h
│ └── libfunc.so
└── test.c

1 directory, 5 files
:~/Documents/clan/test2$ ./a.out
hello world
30

2.jpg

下面我们将用Makefile的形式来使用动态库,编辑Makefile文件

export LD_LIBRARY_PATH:=$LD_LIBRARY_PATH:/func

test : test.c func/libfunc.so

gcc -o test test.c -L./func -lfunc

func/libfunc.so : func/func.c func/func.h

gcc -fPIC -shared -o func/libfunc.so func/func.c

clean :

rm -f test func/libfunc.so

2.jpg

然后编译执行,同样可以输出正确结果

2.jpg

动态库的过程比静态库稍微复杂,但是在写Makefile的时候,步骤基本相似,倒着写gcc编译过程即可。

审核编辑:刘清

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

    关注

    4

    文章

    595

    浏览量

    27455
  • Makefile
    +关注

    关注

    1

    文章

    125

    浏览量

    19196
  • gcc编译器
    +关注

    关注

    0

    文章

    78

    浏览量

    3408
收藏 人收藏

    评论

    相关推荐

    Linux动态链接的基本概念

    学习Linux动态链接个绕不开的话题,我们今天就一起来看一下什么是动态链接
    发表于 09-27 14:31 1570次阅读

    Linux动态相关知识

    Linux 下有动态和静态动态以.so为扩展名,静态以.a为扩展名。二者都使用广泛。本
    的头像 发表于 11-07 09:23 618次阅读
    Linux<b class='flag-5'>下</b><b class='flag-5'>动态</b><b class='flag-5'>库</b>相关知识

    大家一下自己用的是那种STM开发板

    大家一下自己用的是那种STM开发板
    发表于 08-15 23:56

    Linux动态和静态的制作及使用

    的,想象一下,如果多个程序链接了同,则每个生成的可执行文件就都会有的副本,必然会浪
    发表于 11-18 17:05

    Linux静态动态的制作与使用

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

    如何制作个Linux动态

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

    一下嵌入式系统的架构

    主要对嵌入式系统,单片机这块一下嵌入式系统的架构。该系列为硬件的选型第
    发表于 12-07 11:46

    一下PD3.0的电源规则

    电源规则大师匈今天一下PD3.0的电源规则,PD3.0标准标定的规则。USB协议声称,为了世界和平世界环境,让大家用上统标准的充电器,不用再为每个用电设备都配
    发表于 12-31 08:12

    什么是DLL (动态连接)

    什么是DLL (动态连接) DLL(动态连接),既然是动态,那么就是有静态连接,我想如果
    发表于 11-28 14:51 1.5w次阅读

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

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

    LINUX环境CLIPS动态链接的实现方法

    在LINUX环境,为了简便、快捷地制作出CLIPS动态链接,本文采用了CNU AUTOTOOLS把CLIPS嵌入式高级语言编译成动态链接
    发表于 04-14 21:18 30次下载

    Linux的静态动态动态加载

    的存在极大的提高了C/C++程序的复用性,但是对于初学者来说有些难以驾驭,本文从Linux的角度浅谈Linux的静态动态
    发表于 04-02 14:32 830次阅读

    种可在动态环境构建语义地图的算法

    Localization And Mapping,SLAM)算法已经可以达到较高的定位和制图精度,但是在动态环境如何通过剔除动态物体来获得较髙的定位精度,以及理解周围场景中存在的物体及其位置信息等问题没有得到很好的解决。在此
    发表于 05-07 14:56 4次下载

    嵌入式Linux动态和静态使用

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

    Linux的静态链接动态链接的区别是什么?

    学习Linux动态链接个绕不开的话题,我们今天就一起来看一下什么是动态链接
    的头像 发表于 02-17 10:49 1319次阅读
    Linux<b class='flag-5'>下</b>的静态链接<b class='flag-5'>库</b>和<b class='flag-5'>动态</b>链接<b class='flag-5'>库</b>的区别是什么?